我想创建一个函数,它将根据两个数据框中的匹配列创建一组新变量。以下是一些数据:
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这样做,但我没有走得太远。任何帮助将不胜感激!
答案 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