【问题标题】:Match rows between dataframe and replace with a value in another column of the second dataframe匹配数据框之间的行并替换为第二个数据框另一列中的值
【发布时间】: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 + 行)。

标签: r join dataframe


【解决方案1】:

这个问题尚不完全清楚,是否应该从df2 中删除"Novel" 的任何外观,或者仅在重复ID 的情况下删除。第二种情况非常棘手,所以我提出了一个data.table 解决方案,我更熟悉(并且Q 没有明确标记为dplyr

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

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多