【问题标题】:r loop over columns and rowsr 循环遍历列和行
【发布时间】:2016-06-28 18:07:24
【问题描述】:

我正在尝试遍历数据帧所有行中的 column[x],使用一些 ifelse 条件并更新它们的值。所需的结果是具有 x 值和更新条件的新数据框。 这是一个例子:

M <- data.frame(x1=c(1,1,1,1), x2=c(1,1.05,1.1,1.15), x3=c(1.15,1,1.14,1),
            y=c(1, 0.90, 0.98, 0.95), z=c(1,1.11,1.02,1.05))

myfun1 <- function(x, y, z) {
  x <- ifelse(x > z, x*y, 1)
  y <- ifelse(x > z, 1, x*y)
  z <- ifelse(x > z, 1, 1/(x*y))
}

M1 <- as.data.frame(lapply(M, function(x) myfun1(x[1:3], x[4], x[5])))

我也尝试对函数进行矢量化,但它不起作用。有什么帮助吗?

编辑,这是预期的结果

M1 <- data.frame(x1=c(1,1,1,1), x2=c(1,1,1.078,1.093), x3=c(1.15,1,1.14,1),
            y=c(1, 0.945, 1, 1), z=c(1,1.06,1,1))

【问题讨论】:

  • 根据输入,您想要的输出到底是什么?
  • 在“M1”中导出“x”值很容易。但是,我不明白您是如何更新“y”和“z”列的。有 3 个 'x' 列,那么在更新 'y' 和 z' 时使用了 'x' 列中的哪一个? `
  • 请查看 plyr 包中的 ddply
  • 也许这有帮助for(i in 1:3){ M[,i] &lt;- ifelse(M[,i] &gt; M$z, M[,i]*M$y, 1); M$y &lt;- ifelse(M[,i] &gt;M$z, 1, M[,i]*M$y); M$z &lt;- ifelse(M[,i] &gt; M$z, 1, 1/(M[,i]*M$y)); }
  • 从评论到已删除的答案,我认为更新“x”列应该保留到最后,或者只在副本上完成。

标签: r loops if-statement lapply


【解决方案1】:

我们可以使用for 循环

for(i in 1:3){
   M[,i] <- ifelse(M[,i] > M$z, M[,i]*M$y, 1)
   M$y <- ifelse(M[,i] >M$z, 1, M[,i]*M$y)
   M$z <- ifelse(M[,i] > M$z, 1, 1/(M[,i]*M$y))
}
M

【讨论】:

  • 问题是我需要更新 y 和 z 值,使用之前的 x 值。 FALSE条件,需要使用原来的x值(不是1)
  • @AngeG 在这种情况下,您的函数没有达到预期的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多