假设我有以下data.frame
:
>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
的{{1}}为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
个向量。理想情况下,循环将返回Andrew的NA
为lastdateid
而Dora为tmp[2,4]
,而其他所有人的值均为tmp[4,5]
。是什么导致这个循环无限运行?我怎样才能解决这个问题呢?它能给出理想的结果吗?请耐心等待我,因为我对R比较新。谢谢!
答案 0 :(得分:0)
这可能会取代您的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