我有一个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"])
仍然是错误的结果。
答案 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