匹配数据帧之间的行,并替换为第二个数据帧的另一列中的值

时间:2017-07-01 13:52:25

标签: r join dataframe

我有两个数据帧。第一个包含一个包含ID和各种其他列的列,而另一个包含这些ID的映射信息(ID到Name)。

我想将第一个数据框中的ID替换为其他数据框中的Name。

我能够做到这一点

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部分有关。

谢谢,
小号

编辑:以下是一些示例数据框

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

1 个答案:

答案 0 :(得分:0)

问题尚不完全清楚"Novel"是否应该从df2移除,或仅在重复ID的情况下移除。data.table。第二种情况非常棘手,所以我提出了一个dplyr解决方案,我更流利(并且Q没有明确标记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")) library(data.table) DT1 <- data.table(df1) DT2 <- data.table(df2) # case 1 # remove all rows with Name == Novel before joining DT2[!Name %in% c("Novel")][DT1, on = .(ID = X)]

            ID   Name  N
1:   MSTRG.199     NA NA
2: MSTRG.18989 gng7.S  2
3:  MSTRG.8890     NA NA
4:  MSTRG.7767  cdc20  1
# case 2
# remove Novel in cases of duplicate appearances of ID
DT2[, N := .N, by = ID][!(N > 1L & Name %in% "Novel")][, N := NULL][DT1, on = .(ID = X)]
            ID   Name
1:   MSTRG.199  Novel
2: MSTRG.18989 gng7.S
3:  MSTRG.8890  Novel
4:  MSTRG.7767  cdc20
mapDispatchToProps