【问题标题】:R apply for two data framesR申请两个数据框
【发布时间】:2017-09-21 09:03:39
【问题描述】:

我真的可以想象,答案可以在 stackoverflow 上找到,但我不明白。所以这是我的问题:

我有一个 data.frame “tmp”,它由 17 列和许多行组成。 我想要做的是使用apply函数逐行使用来自tmp的信息的近似函数:

tmp[,17] <- apply(tmp[,4:16], 1, approx, y = y, x = tmp[,2])

其中 y 是固定的。

我的问题是,我现在得到了一个 n x n 矩阵,因为 apply 函数计算了每对 tmp[,4:16]tmp[,2]。我需要的只是对角线,即

(tmp[1,4:16], tmp[1,2]), (tmp[2,4:16], tmp[2,2]), (tmp[3,4:16], tmp[3,2]),...

我想避免像diag(apply(...)) 这样的事情或循环,因为我想减少计算时间。

希望有人能帮助我,在此先谢谢你

【问题讨论】:

  • 这可能吗? approx(tmp[1,4:16], tmp[1,2]) 抛出 Error in xy.coords(x, y, setLab = FALSE) : 'x' and 'y' lengths differ.
  • 您需要 approx 函数中的节点:approx(y,tmp[1,4:16],tmp[1,2] ) 其中 y 的长度与 tmp[1,4:16] 相同。在我的应用函数中,我扭曲了ytmp[,4:16],并编写了一个新的近似函数,在其中我以正确的顺序将向量完全放入tmp[,17] <- apply(tmp[,4:16], 1, approx2, y = y, x = tmp[,2])approx2 <- function(tmp,y,tmp2){approx(y,tmp,tmp2)[[2]] }

标签: r apply


【解决方案1】:

这是你想要的吗?请注意,tmp[, 4:16]tmp[, 2] 都使用同一行 i

set.seed(4542)  # make it reproducible

tmp <- as.data.frame(matrix(rnorm(20*17), ncol = 17))
y <- rnorm(length(4:16))

s <- sapply(seq_along(tmp[, 1]), function(i) approx(y, tmp[i, 4:16], tmp[i, 2]))

也可以使用seq_len(nrow(tmp)) 代替seq_along(tmp[, 1])

【讨论】:

  • 这正是我想要的!非常感谢!
  • 在测试你的代码后(它工作得很好!)我有一个问题。为什么当我使用您的代码然后使用问题中的代码时系统时间会更高,但是我得到 n x n 个结果,而您的解决方案只有 n 个结果?
  • @Chefkoch 只是系统时间还是总时间?
  • 总时间。我的版本System.time(replicate(40, diag(apply(tmp[,4:(ncol(tmp)-1)], 1, approx2, y = y, tmp2 = tmp[,2] 给出User 13.82, System 1.11, Total 14.96 而你的版本System.time(replicate(40, sapply(seq_along(tmp[, 1]), function(i) approx(y, tmp[i, 4:16], tmp[i, 2]))) 给出User 19.95, System 0.00, Total 19.95
  • 好吧,我发现最快的方法是使用我的原始代码并以 10 个块为单位执行,以避免在 n x n 矩阵中产生不必要的大量使用。不过还是非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2021-07-19
  • 1970-01-01
  • 2023-03-27
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多