R 匹配另一列中的值后替换一列中的值
我的数据看起来像这样。我现在要做的是使用第二个表中的匹配值替换“旧ID”值:第一个表是R 匹配另一列中的值后替换一列中的值,r,R,我的数据看起来像这样。我现在要做的是使用第二个表中的匹配值替换“旧ID”值:第一个表是 Old ID | Usage 211 25 211 17 211 18 202 11 202 12 194 17
Old ID | Usage
211 25
211 17
211 18
202 11
202 12
194 17
202 16
194 22
194 84
198 26
具有匹配值的第二个表
Old ID | ID
211 abf
202 rdg
194 ufe
198
将旧ID中的每个值替换为第二个表中的相应值后,应更改第一个表。如果ID列中的值缺失或为“NULL”,则第一个表中替换的值应显示为“N/A”。第一个表现在应如下所示
Old ID | Usage
abf 25
abf 17
abf 18
rdg 11
rdg 12
ufe 17
rdg 16
ufe 22
ufe 84
n/a 26
我有大约200万这样的作品。非常感谢您的帮助像这样的事情
df1 <- data.frame(old.id = c(211, 211, 211, 202, 194, 202, 198, 194), usage=c(20:27), stringsAsFactors = F)
df2 <- data.frame(old.id = c(211, 211, 212, 213, 202, 198), ID = c("a", "a", "b", "c", "d", "e"), stringsAsFactors = F)
df1$old.id <- sapply(df1$old.id , (function(nm) { out <- df2[df2$old.id == nm, ]$ID; ifelse(length(out) > 0, out[1], NA) }))
df1
df1首先合并两个表,然后删除重复项,如下所示:
S=merge(df1,df2,by="Old_ID")
S[!duplicated(S),c(3,2)]
ID Usage
1 ufe 17
4 ufe 22
7 ufe 84
10 <NA> 26
11 rdg 11
14 rdg 12
17 rdg 16
20 abf 25
23 abf 17
26 abf 18
S=merge(df1,df2,by=“Old\u ID”)
S[!重复,c(3,2)]
ID使用
1 ufe 17
4 ufe 22
7 ufe 84
10 26
11 rdg 11
14 rdg 12
17 rdg 16
20 abf 25
23 abf 17
26 abf 18
这可以通过加入时的更新来解决:
资料
DT1这基本上只是一个合并-merge(df1,unique(df2),by=“OldID”,all.x=TRUE)
或df1$OldID可能重复Hey Onyanbu,我在发布问题时犯了一个错误。第二个表的条目数与第一个表的条目数不同。第二个是为了匹配旧ID和ID。我已经编辑了这个问题。解决方案可能不同,但代码仍然保持不变
library(data.table)
setDT(DT1)[setDT(DT2), on = "Old_ID", Old_ID := ID][]
Old_ID Usage
1: abf 25
2: abf 17
3: abf 18
4: rdg 11
5: rdg 12
6: ufe 17
7: rdg 16
8: ufe 22
9: ufe 84
10: NA 26
DT1 <- structure(list(Old_ID = c("abf", "abf", "abf", "rdg", "rdg",
"ufe", "rdg", "ufe", "ufe", NA), Usage = c("25", "17", "18",
"11", "12", "17", "16", "22", "84", "26")), .Names = c("Old_ID",
"Usage"), row.names = c(NA, -10L), class = c("data.table", "data.frame"))
DT2 <- structure(list(Old_ID = c("211", "202", "194", "198"), ID = c("abf",
"rdg", "ufe", NA)), .Names = c("Old_ID", "ID"), row.names = c(NA,
-4L), class = c("data.table", "data.frame"))