如果我有一个data.frame
X并想将函数foo
应用于它的每一行,我将只运行apply(X, 1, foo)
。这都是众所周知的和简单的。
现在假设我还有另一个data.frame
Y和以下函数:
mean_of_sum <- function(x,y) {
return(mean(x+y))
}
有没有一种方法可以将“应用等效项”写入以下循环:
my_loop_fun <- function(X, Y)
results <- numeric(nrow(X))
for(i in 1: length(results)) {
results[i] <- mean_of_sum(X[i,], Y[i,])
}
return(results)
如果存在这样的“应用语法”,它会比我的“良好”旧循环更有效吗?
答案 0 :(得分:3)
这应该有效:
$ cat file
Name|city|salary
xyz|pun|450000
Footer|322|02052019|895
您将函数应用于序列sapply(seq_len(nrow(X)), function(i) mean_of_sum(X[i,], Y[i,]))
(其中1, 2, ..., n
是行数),并在每个“迭代”中对第i行求值n
。
答案 1 :(得分:2)
我们可以split
X
和Y
的每一行,并使用mapply
来应用该功能。稍微更改函数mean_of_sum
即可将单行数据帧转换为数字
mean_of_sum <- function(x,y) {
return(mean(as.numeric(x) + as.numeric(y)))
}
考虑一个例子
X <- data.frame(a = 1:5, b = 6:10)
Y <- data.frame(c = 11:15, d = 16:20)
mapply(mean_of_sum, split(X, seq_len(nrow(X))), split(Y, seq_len(nrow(Y))))
# 1 2 3 4 5
#17 19 21 23 25
X
和Y
所在的地方
X
# a b
#1 1 6
#2 2 7
#3 3 8
#4 4 9
#5 5 10
Y
# c d
#1 11 16
#2 12 17
#3 13 18
#4 14 19
#5 15 20
因此第一个值17被计为
mean(c(1 + 11, 6 + 16))
#[1] 17
,以此类推,获取下一个值。