来自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中的当前值相同,这是相同的事情)。以下是条件:
查找RT2中超过平均值+ 2.5 * SD的所有值,并将它们修剪为等于平均值+ 2.5 * SD
if(RT2>平均值+(2.5 * SD))RT2 =平均值+ 2.5 * SD
找到小于平均值的所有值 - 是SD的2.5倍,并将它们修剪为等于平均值 - 2.5 * SD
否则if(RT2&lt; Mean - (2.5 * SD))RT2 = Mean - 2.5 * SD
保留其他所有内容
其他
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
但我不清楚如果将其纳入那里概述的方法(如果没有我上面提到的那样)。
非常感谢任何帮助。谢谢!
答案 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。我没有测试过,因为没有可重现的数据集。某处肯定有错字!