这实际上与我的other question相对应,但事情变得更加复杂。我有data.frame和vector:
df <- data.frame(key=c(0,3:6), value=c(0,52,26,12,1))
x <- c(3,4,3,3,5,5,6,6,6,6)
需要从df中获取基于x的值作为键:
[1] 52 26 52 52 12 12 1 1 1 1
来自previous answer的解决方案只能给出没有重复的结果:
df[df$key %in% x,"value"]
[1] 52 26 12 1
有没有办法解决这个问题?
另外,我看到hash()可以执行以下操作:
h <- hash( keys=letters, values=1:26 )
h$a # 1
h[ "a" ]
h[[ "a" ]]
z <- rep(letters[3:5],2)
h[z] # still with NO duplicates
<hash> containing 3 key-value pair(s).
c : 3
d : 4
e : 5
但似乎它无法返回值的向量,如:
h[[z]]
Error in h[[z]] : wrong arguments for subsetting an environment
否则,它将是完美的,以便我们可以通过使用一些“真正的”哈希概念来摆脱data.frame。
谢谢!
答案 0 :(得分:3)
回答您的第一个问题:使用match
df[match(x, df$key), ]
key value
2 3 52
3 4 26
2.1 3 52
2.2 3 52
4 5 12
4.1 5 12
5 6 1
5.1 6 1
5.2 6 1
5.3 6 1
您还应该查看命名向量
dat <- c(0,52,26,12,1)
names(dat) <- as.character(c(0,3:6))
dat[as.character(x)]
3 4 3 3 5 5 6 6 6 6
52 26 52 52 12 12 1 1 1 1
答案 1 :(得分:2)
我不确定这是否是最好的方式,但是merge()
会让你到达那里:
df <- data.frame(key=c(0,3:6), value=c(0,52,26,12,1))
x <- c(3,4,3,3,5,5,6,6,6,6)
merge(x, df, by.x="x", by.y = "key")
# x value
# 1 3 52
# 2 3 52
# 3 3 52
# 4 4 26
# 5 5 12
# 6 5 12
# 7 6 1
# 8 6 1
# 9 6 1
的更新强> 的
关于你在hash()
上提出的问题,现在会有类似的事情吗?
hashMatch <- function(x, y)
{
laply(y, function(z)
{
x[[z]]
})
}
require(plyr)
require(hash)
h <- hash( keys=letters, values=1:26 )
z <- rep(letters[3:5],2)
hashMatch(h, z)
# [1] 3 4 5 3 4 5
答案 2 :(得分:2)
您可以使用match
选择您的值:
df[match(x,df$key),"value"]
[1] 52 26 52 52 12 12 1 1 1 1