通过键向量(R)获取值

时间:2011-10-31 18:02:06

标签: r hash dataframe

这实际上与我的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。

谢谢!

3 个答案:

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