繁体   English   中英

为什么不能在合并的数据框中替换值?

[英]Why can't I substitute a value in a merged dataframe?

我有两个dataframes ,如下所示:

df1 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
C   no  D
D   no  A
E   yes F
F   yes G
G   no  E", header = T)

df2 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
E   yes F
F   yes G", header = T)

我合并了df1df2interactions <- merge(df1, df2) ,然后尝试将每个SourceTargetdf3进行match

df3 <- read.table(text = "Symbol    ID  Name
A   11  LetterA
C   13  LetterC
D   14  LetterD
F   16  LetterF
G   17  LetterG", header = T)

我得到以下输出:

Source
     Symbol   ID    Name
1         A   11    LetterA
NA     <NA>   NA    <NA>
NA.1   <NA>   NA    <NA>
4         F   16    LetterF

所以我想用df2显示的“原始”输入replace NA ,并获得如下输出:

Symbol  ID   Name
  A     11   LetterA
  B     NA   B
  E     NA   E
  F     16   LetterF

我尝试过:

Source <- df3[match(interactions$Source, df3$Symbol),-4]
my.na <- is.na(Source$Name)
Source$Name[my.na] <- interactions$Source[my.na]
Source$Symbol[my.na] <- interactions$Source[my.na]

但是我得到的是数字而不是字符。 我有什么想念的吗? 是否可以在不使用任何库的情况下替换合并值?

您的问题是,默认情况下, read.table将字符串转换为因子,这些因子以整数形式存储,该整数映射到查找表。 因此,当您尝试将它们插入Source ,它实际插入的是该因子的整数值。 您可以通过在read.table调用中添加以下参数来解决此问题: stringsAsFactors = F ,以便将其中的数据保留为字符串。 现在,当您使用match将值插入Source ,它将插入字符串,而不是因数。

如果仍然有问题,则可能还需要将Source的变量转换为character而不是factor。 你可以这样做:

# Base R:
Source$Symbol <- as.character(Source$Symbol)
Source$Name <- as.character(Source$Name)

# Dplyr:
library(dplyr)
Source <- Source %>%
    mutate_if(is.factor, as.character)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM