通过查找表映射来访问数据帧

时间:2014-05-03 16:33:26

标签: r dataframe

我有一个data.frame a和一个查找表,我想根据查找表中的映射向data.frame a添加标签。映射无法正常工作。

正确的结果应该是:4,2,4,4 我得到:2 3 2 2

a = data.frame (id = c("c", "b", "c", "c"), val = c(1,2,3,4))
lookup = data.frame(id = c("a", "b", "c", "d"), val = c(3,2,4,5))
print(lookup[a$id, "val"])

我也试过这个:

a = data.frame (id = c("c", "b", "c", "c"), val = c(1,2,3,4))
lookup = data.frame(row.names = c("a", "b", "c", "d"), val = c(3,2,4,5))
print(lookup[a$id, "val"])

仍然是错误的结果。

2 个答案:

答案 0 :(得分:0)

我很惊讶我得到了任何结果:

X = data.frame(id = c("c", "b", "a", "b", "a", "a", "c"), val = c(33,22,45,66,11,77,99))
lookup = data.frame( id = c("a", "b", "c", "d"), val = c(11,22,33,44))
lookup[X$id, "val"]
[1] 33 22 11 22 11 11 33

可是:

> lookup[c("c", "b", "a", "b", "a", "a", "c"), "val"]
[1] NA NA NA NA NA NA NA

你的概念问题是你认为并且R以某种方式合谋允许你继续误解,第一列应该被用作索引。 R数据帧具有可用于索引查找的rownames,但rownames的默认值是为1:nrow(dfrm)而不是第一列形成的字符向量,即使它具有名称“id”或“ID”。这种替代策略应该会成功:

lookup = data.frame( row.names = c("a", "b", "c", "d"), val = c(11,22,33,44))

lookup[X$id, "val"]
#[1] 33 22 11 22 11 11 33
lookup[c("c", "b", "a", "b", "a", "a", "c"), "val"]
#[1] 33 22 11 22 11 11 33

我起初并不知道为什么呼叫lookup[X$id, "val"]成功了。我认为不应该这样做。哦,没关系,这是一个因素而不是角色价值。我又被因素绊倒了。 X $ id的数字表示被用作查找,因此任何成功都是完全偶然的。

该怎么办? (现在使用上面编辑过的例子)让我们假设你做了第二个例子。使用命名向量或使用match。并在使用它们进行字符查找时围绕因素包装as.character。以下是各自的例子:

> val <- setNames( c(3,2,4,5),c("a", "b", "c", "d"))
> val[ as.character(a$id)]
c b c c 
4 2 4 4 

> lookup[ as.character(a$id), 'val']
[1] 4 2 4 4

如果使用第一个例子:

> a = data.frame (id = c("c", "b", "c", "c"), val = c(1,2,3,4))
> lookup = data.frame(id = c("a", "b", "c", "d"), val = c(3,2,4,5))
> lookup[match(a$id, lookup$id), "val"]
[1] 4 2 4 4

答案 1 :(得分:0)

另一种方法是在qdap包中使用lookup%l%函数。

> library(qdap)

> a = data.frame (id = c("c", "b", "c", "c"), val = c(1,2,3,4))
> lookUp = data.frame(id = c("a", "b", "c", "d"), val = c(3,2,4,5))

> a$id %l% lookup
[1] 4 2 4 4