使用适用于两个data.frame的

时间:2019-07-17 07:59:37

标签: r loops dataframe apply

如果我有一个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)

如果存在这样的“应用语法”,它会比我的“良好”旧循环更有效吗?

2 个答案:

答案 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 XY的每一行,并使用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 

XY所在的地方

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

,以此类推,获取下一个值。