当尝试更改值时,ifelse()返回逻辑(0)

  • 本文关键字:返回 ifelse r
  • 更新时间 :
  • 英文 :


现在我正试图从数据帧中省略特定的试验。如果人们对他们看到的某个场景的反应时间太长或太短,我想将这些试验排除在我的分析之外。我已经确定了观察结果,现在我想用NAS替换它们。为此,我想使用ifelse()-语句。如果他们的响应时间log_TIME高于或低于某个阈值(高于5.3或低于2.01(,那么我想将他们对用01编码的变量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中的所有值都会变成NAs。我该如何解决这个问题?这是正确的代码吗?还是我必须使用不同的代码?谢谢你的帮助!:(

我用标准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(。然后我们在没有引号的情况下对NAs进行编码。

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))

最新更新