使用订阅从值到另一个值的结束

时间:2018-03-23 16:54:12

标签: r dataframe subscript

我有两个数据帧:

x1 <- c(1,2,1,3,2,2,1,2,3,2)
y1 <- c(10,10,10,11,11,11,12,12,12,13)
df1 <- data.frame(x1,y1)

y <- c(10,11,12,13)
p <- c(0.1,0.5,0.8,0.9)
df2 <- data.frame(y,p)

我想要的是df2 $ p的某种下标,因此df2 $ p的值是根据df1 $ x1-value的输入确定的。规则:df1 $ x1和df1 $ y1形成变量对。 y1 $ df1的不同出现在df2 $ y中列出,属于df2 $ p的值。例如,df1 $ x1 [1](1为1)属于df1 $ y1 [1](即10)。从df2中可以看出,y = 10属于p = 0.1。所以,df1 $ x1 [1]等于p = 0.1。遵循这个逻辑,df1 $ x1 [2]属于p = 0.1,同样适用于df1 $ x1 [3]。 df1 $ x1 [4],df1 $ x1 [5]和df1 $ x1 [6]属于p = 0.5。 df1 $ x1 [7],df1 $ x1 [8]和df1 $ x1 [9]到p = 0.8和df1 $ x1 [10]到p = 0.9。

所需的输出应该是:

> p[input"df1$x1[1]"]
[1] 0.1
> p[input"df1$x1[10]"]
[1] 0.9
> p[input"df1$x1[6]"]
[1] 0.5

或者

> z <- df1$x1[3]
> p[df2$y == df1$y1[df1$x1 == z]]
[1] 0.1

我很感激你的每一个帮助!

1 个答案:

答案 0 :(得分:1)

使用dplyr将@ bouncyball的行合并到一个函数中:

> library(dplyr)
> lookup <- function(x) merge(df1, df2, by.x = 'y1', by.y = 'y') %>%
       slice(x) %>% select(p) %>% as.numeric()

以下是您在问题中包含的示例:

> lookup(1)
[1] 0.1
> lookup(10)
[1] 0.9
> lookup(6)
[1] 0.5