【发布时间】:2017-07-01 13:52:25
【问题描述】:
我有两个数据框。第一个包含一个包含 ID 的列和各种其他列,而另一个包含这些 ID 的映射信息(ID 到名称)。
我想用另一个数据帧中的名称替换第一个数据帧中的 ID。
我能做到
for(id in 1:nrow(df1)){
df1$X[df1$X %in% df2$ID[id]] <- df2$Name[id]
}
只要我在映射文件中没有重复的 ID,这样就可以工作,例如:
ID,Name
MSTRG.11187,gng7.S
MSTRG.11187,Novel
但是这种情况经常发生。我认为如果我可以从映射文件中删除其中包含单词 Novel 的任何行,我之前的代码将起作用。我只是在努力做到这一点。我试过这个:
data = data %>% group_by(GeneID) %>% filter(!("Novel" %in% Gene_Name))
但是在前面的重复 ID 不同名称的示例中,它删除了 gng7.S 的行以及删除了 Novel 的行。我想这样做,但保留 gng7.S 的行,只删除 Novel 的行。
我认为这可能与 group_by 部分有关。
谢谢,
S
编辑:以下是一些示例数据框
df1=data.frame(X=c("MSTRG.199","MSTRG.18989","MSTRG.8890","MSTRG.7767"))
df2=data.frame(ID=c("MSTRG.18989","MSTRG.18989","MSTRG.8890","MSTRG.7767", "MSTRG.199"),Name=c("gng7.S", "Novel", "Novel","cdc20", "Novel"))
【问题讨论】:
-
请提供可重现的数据示例。您可以在 R 中使用一些连接操作来避免 for 循环。
-
data = data %>% group_by(Name) %>% filter(!("Novel" %in% Gene_Name)) 这似乎对映射文件有用,for循环正在工作但这需要很长时间。 (文件长度为 60k + 行)。