R:条件语句迭代相邻列

问题描述:

假设我有以下data.frameR:条件语句迭代相邻列

>tmp 

    user  start.date  X03.16.2013 X03.17.2013 X03.18.2013 X03.19.2013 
    Allison 2013-03-15   5   5   0   2 
    Andrew 2013-03-15   2   0   0   0 
    Carl  2013-03-16   10   8   11   10 
    Dora  2013-03-16   5   4   0   0 
    Hilary 2013-03-17   NA   3   5   0 
    Louis  2013-03-18   NA   NA   8   3 
    Mary  2013-03-19   NA   NA   NA   7 
    Mickey 2013-03-20   NA   NA   NA   NA 

我想一个“死亡之日”分配给谁拥有两个或更多天零个条目的用户。我的方法是运行在列一个循环,并说:“如果tmp[x,j:j+1]之和等于零,则lastdateidtmp[x,j]x行”:

for (j in 3:dim(tmp)[2]){ 
    lastdateid <- apply(tmp, 1, function(x) { 
    i <- which(sum(tmp[x,j:j+1])==0); ifelse(length(i), head(i,1), NA) 
    }) 
} 

上述无限循环运行,也只是创建矢量lastdateidNA s。理想情况下,循环将返回安德鲁的lastdateidtmp[2,4],多拉的为tmp[4,5],其他人的值为NA。什么导致这个循环无限运行?我该如何解决这个问题呢?它给出了期望的结果?因为我对R比较陌生,请耐心等待,谢谢!

这可能会取代您的for循环。这是几条线,但我相信它更有效率。

w <- which(t(apply(tmp == 0, 1, cumsum)) == 2, arr.ind = TRUE) 
w[,2] <- w[,2]-1 
rb <- rbind(w, matrix(, nrow(tmp)-nrow(w), ncol(w))) 
rownames(rb) <- tmp$user[c(x <- w[,2], seq_len(nrow(tmp))[-x])] 

其中给出的结果

> rb 
#   row col 
# Andrew 2 4 
# Dora  4 5 
# Allison NA NA 
# Carl  NA NA 
# Hilary NA NA 
# Louis NA NA 
# Mary  NA NA 
# Mickey NA NA 
+0

@理查德·斯克里感谢您的解决方案。由于我仍然不熟悉使用'which()'和'apply'替换for循环,所以我想知道是否可以帮助我分解第一行。我知道'apply(tmp == 0,1,cumsum)'是在'tmp'行(用MARGIN = 1表示)上应用'cumsum'函数,但我不确定'which'知道在两个相邻列上运行cumsum(未来我希望能够选择多少个相邻的单元格进行求和)。 – Archimeow 2014-09-22 17:40:01

+0

@JMeo当然。 'tmp == 0'将原始数据转换为逻辑矩阵。 't(应用(tmp == 0,1,cumsum)'在整行中运行'cumsum','== 2'用于找出第二次出现零的位置。 ,arr.ind = TRUE)'告诉我们第二次出现零的矩阵行和列索引。 – 2014-09-22 17:44:48

+0

@ Richard Scriven谢谢您花时间为我解决这个问题,我仍然在学习如何最有效地学习使用'apply()'和'which()'代替循环。非常有帮助! – Archimeow 2014-09-24 18:14:51