我有两个数据帧。第一个包含一个包含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"))
答案 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