在R中,是否有一种方法可以使用apply或lapply调用返回包含输入和输出的类似于数据帧的结构?
示例:
input1 <- c(1:3)
input2 <- c(101:103)
apply(data.frame(input1, input2), 1, function(x) {return (x['input1'] + x['input2'])})
产生:
[1] 102 104 106
有没有一种方法可以使用apply语句来创建以下内容:
input1 input2 output
1 1 101 102
2 2 102 104
3 3 103 106
答案 0 :(得分:2)
您甚至不需要在这里apply
,
dat <- data.frame(input1, input2)
dat[, "output"] <- dat[, "input1"] + dat[, "input2"]
dat
# input1 input2 output
#1 1 101 102
#2 2 102 104
#3 3 103 106
这是这两种方法的快速基准
# dummy data
dat2 <- do.call(rbind, replicate(1e5, dat, simplify = FALSE))
library(microbenchmark)
benchmark <- microbenchmark(
"apply" = transform(dat2, output = apply(dat2, 1, function(x) x['input1'] + x['input2'])),
"not-apply" = `[<-`(dat2, "output", value = dat2[, "input1"] + dat2[, "input2"]),
times = 50
)
autoplot(benchmark)
#Unit: milliseconds
# expr min lq mean median #uq max neval
# apply 1422.320194 1652.910918 2208.146278 2170.704283 2659.947690 3665.780187 50
# not-apply 1.778778 1.823522 1.976408 1.900479 2.123708 2.746042 50
答案 1 :(得分:0)
我们可以使用基数R的transform
df <- data.frame(input1, input2)
transform(df, output = apply(df, 1, function(x) x['input1'] + x['input2']))
# input1 input2 output
#1 1 101 102
#2 2 102 104
#3 3 103 106