[英]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)
我合并了df1
和df2
: interactions <- merge(df1, df2)
,然后尝试将每个Source
和Target
与df3
进行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.