我有一张50000遮挡的大桌子。以下模仿结构:
ID <- c(1,2,3,4,5,6,7,8,9)
a <- c("A","B",NA,"D","E",NA,"G","H","I")
b <- c(11,2233,12,2,22,13,23,23,100)
c <- c(12,10,12,23,16,17,7,9,7)
df <- data.frame(ID ,a,b,c)
向量“a”上有一些缺失值。但是,我有一些表包含ID和缺少的字符串:
ID <- c(1,2,3,4,5,6,7,8,9)
a <- c("A","B","C","D","E","F","G","H","I")
key <- data.frame(ID,a)
有没有办法使用ID将密钥中缺少的字符串包含到列a中?
答案 0 :(得分:2)
另一个选择是使用data.table
的快速二进制连接和通过引用更新功能
library(data.table)
setkey(setDT(df), ID)[key, a := i.a]
df
# ID a b c
# 1: 1 A 11 12
# 2: 2 B 2233 10
# 3: 3 C 12 12
# 4: 4 D 2 23
# 5: 5 E 22 16
# 6: 6 F 13 17
# 7: 7 G 23 7
# 8: 8 H 23 9
# 9: 9 I 100 7
如果您想仅替换 NA
s(不是所有已加入的案例),将会有更复杂的实施
setkey(setDT(key), ID)
setkey(setDT(df), ID)[is.na(a), a := key[.SD, a]]
答案 1 :(得分:1)
你可以使用match
;但是,我建议您的数据集都使用character
而不是factor
来防止以后出现问题。
key$a <- as.character(key$a)
df$a <- as.character(df$a)
df$a[is.na(df$a)] <- key$a[match(df$ID[is.na(df$a)], key$ID)]
df
# ID a b c
# 1 1 A 11 12
# 2 2 B 2233 10
# 3 3 C 12 12
# 4 4 D 2 23
# 5 5 E 22 16
# 6 6 F 13 17
# 7 7 G 23 7
# 8 8 H 23 9
# 9 9 I 100 7
当然,您可以始终坚持使用factor
并将整个&#34; ID&#34;列并使用标签替换列&#34; a&#34; ....
factor(df$ID, levels = key$ID, labels = key$a)
## [1] A B C D E F G H I
## Levels: A B C D E F G H I
将其分配给df$a
并且您已完成....
答案 2 :(得分:0)
命名向量可以生成很好的查找表:
lookup <- a
names(lookup) <- as.character(ID)
查找现在是一个命名向量,您可以通过查找[ID]访问每个值,例如查找[&#34; 2&#34;](确保数字是字符,而不是数字)
## should give you a vector of a as required.
lookup[as.character(ID_from_big_table)]