基于重复ID列表的条件计数

时间:2018-02-02 14:50:55

标签: r for-loop if-statement

我似乎无法让这个工作或找到答案。 我有一个这样的数据框:

PatientID <- c('1', "1", "1","1", "2","2","2","2","3")
hospital.time <- c(1,1,1,2,1,2,3,4,1)
fever <- c(1,1,NA,0,1,NA,1,1,NA)
ventilator<-c(1,0,1,1,0,1,0,1,NA)
df <- data.frame(PatientID, hospital.time, fever,ventilator)

每位患者都有几次测量,因此每次测量都会重复ID。 我想算一下1小时内有多少病人发烧和呼吸机,有多少病人只有发烧,有多少只用于呼吸机,同样用于2小时,3小时等。

我尝试过使用基于PatientID的boolean和dplyr,但没有运气。 我是否必须将其置于for循环中才能使其正常工作?

希望你能提供帮助。

2 个答案:

答案 0 :(得分:0)

这是使用dplyr的方法:

library(dplyr)

pid <- c('1', "1", "1","1", "2","2","2","2","3")
hospital.time <- c(1,1,1,2,1,2,3,4,1)
fever <- c(1,1,NA,0,1,NA,1,1,NA)
ventilator<-c(1,0,1,1,0,1,0,1,NA)
df <- data.frame(pid, hospital.time, fever,ventilator)

dfg<-df %>% mutate(fv=ifelse(fever==1 & ventilator==1, 1, 0)) %>% group_by(pid) %>% summarise(f=sum(fever,na.rm=TRUE), v=sum(ventilator, na.rm=TRUE), fv=sum(fv, na.rm=TRUE))
dfg

输出:

     pid     f     v    fv
  (fctr) (dbl) (dbl) (dbl)
1      1     2     3     1
2      2     3     2     1
3      3     0     0     0

答案 1 :(得分:0)

dplyr的另一种方式:

df %>%
  group_by(PatientID, hospital.time) %>%
  summarise(f = ifelse(sum(fever, na.rm =T) > 0, 1, 0), 
            v = ifelse(sum(ventilator, na.rm = T) > 0, 1, 0), 
            fandV = ifelse(sum(c(ventilator, fever), na.rm = T) > 1, 1, 0))

PatientIDhospital.time进行分组,并为每个ID和小时返回二进制值,无论他们是否有发烧,呼吸机或两者兼而有之。