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

时间:2018-05-14 14:05:00

标签: r class dataframe types merge

我有两个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)然后我尝试match每个SourceTarget df3 }。

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

所以我希望replace使用NA中显示的“原始”输入df2并获得如下输出:

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]

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

1 个答案:

答案 0 :(得分:2)

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

如果您仍然遇到问题,您可能还需要将Source中的变量转换为字符而不是因子。你可以这样做:

# 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)