大数据帧上的条件If语句

时间:2018-08-20 21:25:32

标签: r dataframe logic conditional-statements

我正在寻找最简单的方法来从R中的数据框中检索信息。该数据框包含多个日期,第0天,第1天,第2天,第3天,第4天,第5天,第6天第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   需要

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  • 使用data.frame子集比for循环并嵌套if更好;
  • 我在符合您过滤条件的data.frame中添加了一个观察值,否则示例的输出为空;
  • 如果将NA添加到任何数字,结果为NA,则!is.na(events + day0 + day1)是三个嵌套if的缩写。
  • 您应使用功能is.na进行NA检查,因为例如10 != NA返回NA
  • if-条件引发错误,如果您提供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