如何匹配缺失的ID?

时间:2015-07-01 08:24:36

标签: r

我有一张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中?

3 个答案:

答案 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)]