现在我正试图从数据帧中省略特定的试验。如果人们对他们看到的某个场景的反应时间太长或太短,我想将这些试验排除在我的分析之外。我已经确定了观察结果,现在我想用NA
S替换它们。为此,我想使用ifelse()
-语句。如果他们的响应时间log_TIME
高于或低于某个阈值(高于5.3或低于2.01(,那么我想将他们对用0
和1
编码的变量answer
中的那些场景的回答替换为NA
我的数据看起来像这样:
logTIME001 answer001
2.944439 1
3.912023 1
3.583519 0
1.098612 1
3.850148 0
5.700444 1
这是我尝试过的代码:
ifelse(df$logTIME001 > 5.310, df$answer001 == "NA")
ifelse(df$logTIME001 < 2.01, df$answer001 == "NA")
但如果我这样做,它会返回logical(0)
,而answer001
中的所有值都会变成NA
s。我该如何解决这个问题?这是正确的代码吗?还是我必须使用不同的代码?谢谢你的帮助!:(
我用标准iris数据帧为您编写了一个解决方案。你应该能够将它应用于你的问题。
library(datasets)
head(iris)
iris$Species[iris$Sepal.Length<4.5 | iris$Sepal.Length>5.5] <- NA
iris$Species定义要用NA替换的列
iris$Sepal.Length定义要检查特定条件的列
|是两个条件的逻辑OR连接器;如果其中一个是真的,它会用NA覆盖物种列的行条目
这里有两个问题。ifelse
有三个自变量ifelse(test, yes, no)
(参见?ifelse
(。然后我们在没有引号的情况下对NA
s进行编码。
ifelse(df$logTIME001 > 5.310, NA, df$answer001)
# [1] 1 1 0 1 0 NA
ifelse(df$logTIME001 < 2.01, NA, df$answer001)
# [1] 1 1 0 NA 0 1
不过,在这里使用within
可能更好:
df <- within(df, {
answer001[logTIME001 > 5.310 | logTIME001 < 2.01] <- NA
})
df
# logTIME001 answer001
# 1 2.944439 1
# 2 3.912023 1
# 3 3.583519 0
# 4 1.098612 NA
# 5 3.850148 0
# 6 5.700444 NA
数据:
df <- structure(list(logTIME001 = c(2.944439, 3.912023, 3.583519, 1.098612,
3.850148, 5.700444), answer001 = c(1L, 1L, 0L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA,
-6L))