如何创建一个匹配一列的函数,然后抓取另一列的下一个观察?

时间:2016-03-25 22:01:00

标签: r

我想创建一个函数,它将根据两个数据框中的匹配列创建一组新变量。以下是一些数据:

A <- structure(list(obs = c(1, 2, 3), start.time = c(2, 5, 10)), .Names = c("obs", "start.time"), row.names = c(NA, -3L), class = "data.frame") 
B <- structure(list(time.2 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), value = c(5, 15, 17, 21, 3, 14, 10, 4, 1, 33, 13)), .Names = c("time.2", "value"), row.names = c(NA, -11L), class = "data.frame")

我试图将data.frame A的start.time与data.frame B的time.2列匹配,然后匹配后,采用B的值列的迭代步骤创建一个新的A中的变量。这是我的功能(我不确定它的编写方式应该是这样的):

f1 <- function(x1, y1){B[x1==(time.2 - y1),]$value}

例如,我想要

f1(A$start.time, 1) 

返回值(17,14,13)。

而且,

f1(A$start.time, 2)

返回值(21,10,NA)。

我想为一系列数字(比如1:2)执行此操作,并在此过程中在A data.frame中创建变量。那就是A $ newvar.1将包含(17,14,13)而A $ newvar.2将包含(21,10,NA)。

我试过通过mapply这样做,但我没有走得太远。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

fun1 <- function(x, y, n){
  y$value[match(x$start.time + n, y$time.2)]
}
fun1(A, B, 1)
#[1] 17 14 13
fun1(A, B, 2)
#[1] 21 10 NA

根据你的评论,我认为如果你想创建一个包含多个n的列表,那么最好的方法是创建一个带有n和lapply函数的向量,即

v1 <- c(1:3)
lapply(v1, function(i) fun1(A, B, i))
#[[1]]
#[1] 17 14 13

#[[2]]
#[1] 21 10 NA

#[[3]]
#[1]  3  4 NA