我正在尝试重新格式化纵向数据,以进行事件分析。在下面的示例数据中,我只想查找每个ID最早的结果为“ 0”的一周。
我遇到的具体问题是如何处理那些不能全部转换为0或全为1或2的患者。在示例数据中,患者的J
全为1。
#Sample data
have<-data.frame(patient=rep(LETTERS[1:10], each=9),
week=rep(0:8,times=10),
result=c(1,0,2,rep(0,6),1,1,2,1,rep(0,5),1,1,rep(0,7),1,rep(0,8),
1,1,1,1,2,1,0,0,0,1,1,1,rep(0,6),1,2,1,rep(0,6),1,2,rep(0,7),
1,rep(0,8),rep(1,9)))
patient week result
A 0 1
A 1 0
A 2 2
A 3 0
A 4 0
A 5 0
A 6 0
A 7 0
A 8 0
B 0 1
B 1 0
... .....
J 6 1
J 7 1
J 8 1
我可以使用以下代码来完成相对简单的过程:
want<-aggregate(have$week, by=list(have$patient,have$result), min) want<-want[which(want[2]==0),]
但要意识到如果某人未转换为0,则会将其排除在外(在此示例中,患者J
被排除在外)。相反,J
应该1
在第二列和8
第三列中带有一个。相反,它当然被省略了
print(want)
Group.1 Group.2 x
A 0 1
B 0 4
C 0 2
D 0 1
E 0 6
F 0 3
G 0 3
H 0 2
I 0 1
#But also need
J 1 8
根据准则张贴在这里,我没有工作,解决这个问题,我能得到什么,我需要非常粗暴:
mins<-aggregate(have$week, by=list(have$patient,have$result), min)
maxs<-aggregate(have$week, by=list(have$patient,have$result), max)
want<-rbind(mins[which(mins[2]==0),],maxs[which(maxs[2]==1&maxs[3]==8),])
这将返回正确的所需数据集,但是编码是糟糕的,而且不可持续,因为我正在处理其他数据集(即,由于必须手动输入maxsp[3]==8
,所以具有不同时间范围的数据集等)。
有没有更优雅或更系统的方法来解决此数据处理问题?
我们可以编写一个函数来从组中选择一行。
select_row <- function(result, week) {
if(any(result == 0)) which.max(result == 0) else which.max(week)
}
如果存在该函数,则返回第一个0值的索引,否则返回最大值为的索引week
。
并将其应用于所有组。
library(dplyr)
have %>% group_by(patient) %>% slice(select_row(result, week))
# patient week result
# <fct> <int> <dbl>
# 1 A 1 0
# 2 B 4 0
# 3 C 2 0
# 4 D 1 0
# 5 E 6 0
# 6 F 3 0
# 7 G 3 0
# 8 H 2 0
# 9 I 1 0
#10 J 8 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句