通过键向量(R)获取值

Roc*_*ock 5 hash r dataframe

这实际上与我的其他问题相对应,但事情变得更加复杂.我有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)
Run Code Online (Sandbox Code Playgroud)

并且需要从基于x的df获取值作为键:

[1] 52 26 52 52 12 12 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

上一个答案的解决方案只能给出没有重复的结果:

df[df$key %in% x,"value"]
[1] 52 26 12  1
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?

另外,我看到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
Run Code Online (Sandbox Code Playgroud)

但似乎它无法返回值的向量,例如:

h[[z]]
Error in h[[z]] : wrong arguments for subsetting an environment
Run Code Online (Sandbox Code Playgroud)

否则,它将是完美的,以便我们可以通过使用一些"真正的"哈希概念来摆脱data.frame.

谢谢!

And*_*rie 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
Run Code Online (Sandbox Code Playgroud)

您还应该看看命名向量

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 
Run Code Online (Sandbox Code Playgroud)