【问题标题】:Conditional If statement over large data frame大型数据帧上的条件 If 语句
【发布时间】:2018-08-20 21:25:32
【问题描述】:

我正在寻找从 R 中的数据框中检索信息的最直接方法。数据框包含多个日期,第 0 天、第 1 天、第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 4 天7 天和第 8 天。事件列在特定日期,我们有兴趣查找在任何连续两天之间发生的事件,以及在存在空条目的日期之间发生的事件(下表中的 ee 将包括第 1 行中的第 3 天和第 5 天)。

    Person  day0 day1 day2 day3 day4 day5 day6  day7 events
     1      10   12   14   18   NA   22   32   50     20
     2      11   15   19   NA   NA   NA   50   67     35
     3      12   18   21   26   33   42   50   NA     45
     4      15   24   32   NA   43   NA   54   76     40

完整的数据集有几千人。

我尝试在前两天检查并将事件写入向量:

for(i in 1:length(days$Person)){
if(days$event[i] != NA){
if(days$day0[i] != NA){
if(days$day1[i] != NA){

 if(days$day0[i] < days$events[i] & days$day1[i] > days$events[i]){
     vector[i]<-events[i]
}
}
}

但是,我仍然遇到错误。

if (days$day1[i] != NA) { 中的错误:缺少 TRUE/FALSE 的值 需要

任何帮助将不胜感激。

【问题讨论】:

  • 你能显示预期的输出吗?
  • if (days$day1[i] != NA) { 中的错误:需要 TRUE/FALSE 的地方缺少值
  • 预期输出只是一个带有事件日期的向量。
  • variable != NA 错误,使用!is.na(variable)
  • 你的第一个 if 应该是 if(days$event[i] != NA),而它应该是 events,最后是 s

标签: r dataframe logic conditional-statements


【解决方案1】:
  • 最好使用data.frame子集而不是for循环和嵌套if
  • 我在data.frame 中添加了符合您过滤条件的观察,否则您的示例输出为空;
  • 如果将NA 添加到任意数字,则结果为NA!is.na(events + day0 + day1) 是三个嵌套if 的缩短版本。
  • 您应该使用函数is.na 进行NA 检查,因为例如10 != NA 返回NA
  • if-condition 会抛出您提到的错误,如果您提供 NA
  • 最好使用dput(head(your_data.frame)) 提供输入数据的示例以及所需的输出,这将有助于从社区获得帮助。

请看下面的代码:

days <- structure(list(Person = 1:5, day0 = c(10L, 11L, 12L, 15L, 1L), 
    day1 = c(12L, 15L, 18L, 24L, 20L), day2 = c(14L, 19L, 21L, 
    32L, 3L), day3 = c(18L, NA, 26L, NA, 4L), day4 = c(NA, NA, 
    33L, 43L, 5L), day5 = c(22L, NA, 42L, NA, 6L), day6 = c(32L, 
    50L, 50L, 54L, 7L), day7 = c(50L, 67L, NA, 76L, 8L), events = c(20L, 
    35L, 45L, 40L, 10L)), class = "data.frame", row.names = c(NA, 
-5L))
vector <- subset(days, !is.na(events + day0 + day1) & day0 < events & day1 > events)[["events"]]
vector

输出是满足您条件的事件数量的向量:

# [1] 10

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 2021-06-19
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多