为半“双重帖子”道歉。我觉得我应该能够解决这个问题,但我会围成一圈。这与我以前回答良好的问题类似:
Within ID, check for matches/differences
test <- data.frame(
ID=c(rep(1,3),rep(2,4),rep(3,2)),
DOD = c(rep("2000-03-01",3), rep("2002-05-01",4), rep("2006-09-01",2)),
DOV = c("2000-03-05","2000-06-05","2000-09-05",
"2004-03-05","2004-06-05","2004-09-05","2005-01-05",
"2006-10-03","2007-02-05")
)
我想要做的是标记第一个vist(如DOV)诊断时间不到180天(DOD)的受试者。我从plyr包中得到以下内容。
ddply(test, "ID", function(x) ifelse( (as.numeric(x$DOV[1]) - as.numeric(x$DOD[1])) < 180,1,0))
给出了:
ID V1
1 A 1
2 B 0
3 C 1
我想要的是矢量1,1,1,0,0,0,0,1,1所以我可以将它作为列附加到数据帧。基本上这个ddply函数很好,它创建了一个'查找'表,在那里我可以看到哪些ID在诊断后的180天内首次访问,然后我可以进行原始测试并通过并生成指示变量,但是我应该能做到这一点是我想到的一步。
如果可能的话,我也想使用base。我有一个带有'by'的方法,但同样它只为每个ID提供了一个结果,也是一个列表。一直在尝试聚合,但得到'必须是一个列表',然后'它不是相同的长度'和使用输入的公式方法我难倒'cbind(DOV,DOD)~ID'...
欣赏输入,热衷于学习!
答案 0 :(得分:2)
在创建那些日期列之后包装as.Date之后,这将返回所需的标记向量,假设名为'test'的df按ID排序(并在base中完成):
# could put an ordering operation here if needed
0 + unlist( # to make vector from list and coerce logical to integer
lapply(split(test, test$ID), # to apply fn with ID
function(x) rep( # to extend a listwise value across all ID's
min(x$DOV-x$DOD) <180, # compare the minimum of a set of intervals
NROW(x)) ) )
11 12 13 21 22 23 24 31 32 # the labels
1 1 1 0 0 0 0 1 1 # the values
答案 1 :(得分:1)
我已添加到data.frame函数stringsAsFactors = FALSE:
test <- data.frame(ID=c(rep(1,3),rep(2,4),rep(3,2)),
DOD = c(rep("2000-03-01",3), rep("2002-05-01",4), rep("2006-09-01",2)),
DOV = c("2000-03-05","2000-06-05","2000-09-05","2004-03-05",
"2004-06-05","2004-09-05","2005-01-05","2006-10-03","2007-02-05")
, stringsAsFactors=FALSE)
CODE
test$V1 <- ifelse(c(FALSE, diff(test$ID) == 0), 0,
1*(as.numeric(as.Date(test$DOV)-as.Date(test$DOD))<180))
test$V1 <- ave(test$V1,test$ID,FUN=max)