我正在寻找最简单的方法来从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 需要
任何帮助将不胜感激。
答案 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