【问题标题】:Applying an if then loop to each row of data frame in R将 if then 循环应用于 R 中的每一行数据帧
【发布时间】:2012-08-15 17:26:33
【问题描述】:

来自 R 新手的另一个基本问题。我有一个数据集:testMeanSD。这是一些相关数据,使用 dput() - 我第一次尝试这个输出,所以我希望我做得正确:

testMeanSD <- structure(list(RT = c(1245L, 1677L, 1730L, 1066L, 994L), mean = c(1143.77777777778, 
1143.77777777778, 1143.77777777778, 1143.77777777778, 1143.77777777778
), sd = c(202.255299928596, 202.255299928596, 202.255299928596, 
202.255299928596, 202.255299928596), RT2 = c(1245L, 1677L, 1730L, 
1066L, 994L)), .Names = c("RT", "mean", "sd", "RT2"), row.names = c(NA, 
5L), class = "data.frame")

RT2 只是我要修改的 RT 的副本。对于每一行,如果满足某些条件,我需要更改 RT2 的值。否则 RT2 与 RT 保持相同(或与 RT2 中的当前值相同,这是同一件事)。以下是条件:

  1. 找出 RT2 中所有超过平均值 + 2.5 * SD 的值,并将它们修剪为等于平均值​​ + 2.5 * SD

    如果 (RT2 > 平均值 + (2.5 * SD)) RT2 = 平均值 + 2.5 * SD

  2. 找出所有小于平均值 - 2.5 倍 SD 的值并将它们修剪为等于平均值​​ - 2.5 * SD

    else if (RT2

  3. 其他一切保持原样

    其他
    RT2 = RT

我认为这在 R 中是相当基本的,但我根本找不到让它工作的方法。以下是我的一些尝试(都失败了):

第一:

testMeanSD$RT2 = testMeanSD$RT
if (testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$sd))) {
    testMeanSD$RT2 = (testMeanSD$mean + (2.5 * testMeanSD$sd))
}
else if(testMeanSD$RT2 < (testMeanSD$mean - (2.5 * testMeanSD$sd))) {
    testMeanSD$RT2 = (testMeanSD$mean - (2.5 * testMeanSD$sd))
}
else {
    testMeanSD$RT2 = testMeanSD$RT
}

第二个:

ifelse(testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$SD)), testMeanSD$RT2 <- (testMeanSD$mean + (2.5 * testMeanSD$sd)),
    ifelse(testMeanSD$RT2 < (testMeanSD$Mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- (testMeanSD$mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- testMeanSD$RT)

第三:

testMeanSD$RT2 <- ifelse(testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$sd)), testMeanSD$mean + (2.5 * testMeanSD$sd)),
   ifelse(testMeanSD$RT2 < (testMeanSD$mean - (2.5 * testMeanSD$SD)), (testMeanSD$mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- testMeanSD$RT)

我浏览了一些相关的帖子,这一篇似乎最接近:Loop over rows of dataframe applying function with if-statement

但我不清楚如何将 if then 合并到那里概述的方法中(如果不是我上面的方法)。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果您花时间使您的问题具有可重复性,您会发现您会得到更好的答案。请遵循指南(stackoverflow.com/questions/5963269/…),特别注意关于dput()的部分。谢谢!
  • 嗨,Ari,感谢您指出我的发帖错误 - 我想在这里做一些事情。我正在研究如何使用 dput() 现在。我的数据集很大,显然我需要将其缩小或制作一些假数据,而且我是 R 新手,所以这可能需要一些时间。谢谢 - DT
  • 好的-完成。我认为我做对了。感谢您为我指明正确的方向。
  • 看起来不错。感谢您添加可重现的示例!

标签: r


【解决方案1】:

您几乎肯定希望避免循环和 if 语句,以支持向量化条件和赋值。

让我们以您的第一个示例 if (RT2 &gt; Mean + (2.5 * SD)) RT2 = Mean + 2.5 * SD 为例,假设您的 data.frame 名为 dat

sel <- dat$RT2>dat$mean + 2.5*dat$SD # creates a boolean of length nrow(dat)
dat$RT2[sel] <- with(dat[sel,], mean + 2.5*SD)

您可以使用with() 来节省大量“dat$”的输入。

注意由于没有可重现的数据集,我没有对此进行测试。几乎可以肯定某处有错字!

【讨论】:

  • 也可以使用with设置sel:sel &lt;- with(dat, RT2 &gt; mean + 2.5*sd)
  • 好的,如果我理解正确,你的意思是我应该独立应用前两个条件并跳过第三个。似乎工作。感谢您的帮助!
  • @user1603288 没错。这是编写类 R 代码而不是使用 forif 真正值得的领域之一。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多