R:条件语句迭代相邻列
问题描述:
假设我有以下data.frame
:R:条件语句迭代相邻列
>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]
之和等于零,则lastdateid
是tmp[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)
})
}
上述无限循环运行,也只是创建矢量lastdateid
满NA
s。理想情况下,循环将返回安德鲁的lastdateid
为tmp[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
@理查德·斯克里感谢您的解决方案。由于我仍然不熟悉使用'which()'和'apply'替换for循环,所以我想知道是否可以帮助我分解第一行。我知道'apply(tmp == 0,1,cumsum)'是在'tmp'行(用MARGIN = 1表示)上应用'cumsum'函数,但我不确定'which'知道在两个相邻列上运行cumsum(未来我希望能够选择多少个相邻的单元格进行求和)。 – Archimeow 2014-09-22 17:40:01
@JMeo当然。 'tmp == 0'将原始数据转换为逻辑矩阵。 't(应用(tmp == 0,1,cumsum)'在整行中运行'cumsum','== 2'用于找出第二次出现零的位置。 ,arr.ind = TRUE)'告诉我们第二次出现零的矩阵行和列索引。 – 2014-09-22 17:44:48
@ Richard Scriven谢谢您花时间为我解决这个问题,我仍然在学习如何最有效地学习使用'apply()'和'which()'代替循环。非常有帮助! – Archimeow 2014-09-24 18:14:51