数据子集,基本函数,向量输出中的自定义函数?

时间:2011-05-06 01:28:53

标签: r

为半“双重帖子”道歉。我觉得我应该能够解决这个问题,但我会围成一圈。这与我以前回答良好的问题类似:

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'...

欣赏输入,热衷于学习!

2 个答案:

答案 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)