我正在寻找从R中的数据框架中检索信息的最直接的方法。数据框架包含几个日期,第0天、第1天、第2天、第3天、第4天、第5天、第6天、第7天和第8天。这些事件列在特定日期上,我们感兴趣的是查找在任何连续两天之间以及存在空条目的日期之间发生的事件(例如。在下表中,这将包括第3至第5天之间的第1行)。
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中出错(天$day1i != NA) {:缺少真/假需要的值
任何帮助都将不胜感激。
发布于 2018-08-26 07:12:20
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] 10https://stackoverflow.com/questions/51938702
复制相似问题