我有两个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)
我合并了df1
和df2
:interactions <- merge(df1, df2)
然后我尝试match
每个Source
和Target
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]
但我得到数字而不是字符。有什么我想念的吗? 是否可以在不使用任何库的情况下替换合并值?
答案 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)