遵循 James 的建议,编写一个解决问题的函数,但要更健壮一点(处理所有答案均为 NA 的情况)
f0 = function(df) {
idx = ifelse(is.na(df), 0L, col(df))
apply(idx, 1, max)
}
The L
使 0 成为整数,而不是数字。为了提高速度(当有很多行时),请使用matrixStats包
f1 = function(df) {
idx = ifelse(is.na(df), 0L, col(df))
matrixStats::rowMaxs(idx, na.rm=TRUE)
}
按照 markus 的建议在 dplyr 上下文中使用它
mutate(df, lastqnum = f1(df), lastq = c(NA, names(df))[lastqnum + 1])
df %>% mutate(lastqnum = f1(.), lastq = c(NA, names(.))[lastqnum + 1])
或者只是这样做
lastqnum = f1(df)
cbind(df, lastq=c(NA, names(df))[lastqnum + 1], lastqnum)
接受后编辑我想整洁的方法首先是将数据整理成长形式
df1 = cbind(gather(df), id = as.vector(row(df)), event = as.vector(col(df)))
然后进行分组和总结
group_by(df1, id) %>%
summarize(lastq = tail(event[!is.na(value)], 1), lastqname = key[lastq])
当没有答案时,这不能处理这种情况。