对if中的每一行数据帧应用if then循环

时间:2012-08-20 11:18:30

标签: r

来自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

      

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

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

      

    否则if(RT2&lt; Mean - (2.5 * SD))RT2 = Mean - 2.5 * SD

  3. 保留其他所有内容

      

    其他
        RT2 = RT

  4. 我认为这在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

    但我不清楚如果将其纳入那里概述的方法(如果没有我上面提到的那样)。

    非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

你几乎肯定想要避免循环和if语句,这里有利于向量化条件和赋值。

假设您的data.frame被称为if (RT2 > Mean + (2.5 * SD)) RT2 = Mean + 2.5 * SD,我们将采用您的第一个示例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$”的输入内容。

N.B。我没有测试过,因为没有可重现的数据集。某处肯定有错字!