我尽量不使用for循环,而是使用函数和lapply生成一个以天分隔的日期序列,并将其附加到数据中。首先,我尝试了
x = data.frame(
date = seq.Date(from = as.Date((q)[['d1']]),to = as.Date(q[['d2']]),by = "days"),
m = (q)[['m']],
stringsAsFactors = F
)
return(x)
}
y = list(
d1 = as.Date(c("2012/01/31","2012/01/14")),
d2 = as.Date(c("2012/01/31","2012/01/21")),
m = c(100,75))
z <- do.call(rbind,lapply(y,fn))
但我在[[.default
(q,"d1"(中得到错误:下标越界,我试图使用get((来修复它
然后我尝试了
x = data.frame(
date = seq.Date(from = as.Date(get(q)[['d1']]),to = as.Date(get(q[['d2']]),by = "days"),
m = get(q)[['m']],
stringsAsFactors = F
)
return(x)
}
y = list(
d1 = as.Date(c("2012/01/31","2012/01/14")),
d2 = as.Date(c("2012/01/31","2012/01/21")),
m = c(100,75))
z <- do.call(rbind,lapply(y,fn))
我试过了,但在get(q(中出错:第一个参数无效
在list
上执行lapply
时,它会将函数单独应用于每一列。您的lapply(y, fn)
相当于list(fn(y[["d1"]]), fn(y[["d2"]]), fn(y[["q"]]))
,因为这些都是列表项。当然,这不起作用,因为您的函数需要一个list
,其中d1
、d2
和q
各有一个值作为输入。
只需进行最小的更改,我们就可以将您的列表转换为数据帧,并将该函数应用于行:
dy = as.data.frame(y)
result = do.call(rbind, lapply(1:nrow(dy), (i) fn(dy[i, ])))
result
# date m
# 1 2012-01-31 100
# 2 2012-01-14 75
# 3 2012-01-15 75
# 4 2012-01-16 75
# 5 2012-01-17 75
# 6 2012-01-18 75
# 7 2012-01-19 75
# 8 2012-01-20 75
# 9 2012-01-21 75