R:迭代相邻列的条件语句

时间:2014-09-19 21:25:56

标签: r conditional-statements apply

假设我有以下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的NAlastdateid而Dora为tmp[2,4],而其他所有人的值均为tmp[4,5]。是什么导致这个循环无限运行?我怎样才能解决这个问题呢?它能给出理想的结果吗?请耐心等待我,因为我对R比较新。谢谢!

1 个答案:

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