我有以下数据框
df <- data.frame(col1 = c(0,0,1,1),col2 = c(1,0,0,3),col2 = c(1,0,0,3))
如何识别每个值大于0的第一个值。 预期的输出就像这样
df <- data.frame(col1 = c(0,0,1,1),col2 = c(1,0,0,3),col3 = c(1,0,0,3),col4 = c(1,0,1,1))
我尝试了以下
for (i in 1:3){
df$col4 <- apply(df[,c(0:i)],1,sum)
if (df$col4>0)
break
}
答案 0 :(得分:1)
我们可以使用max.col()
。
df[cbind(1:nrow(df), max.col(df > 0, "first"))]
# [1] 1 0 1 1
答案 1 :(得分:0)
希望这有帮助!
df$col4 <- apply(df, 1, function(x) x[which(x>0)[1]])
df[is.na(df$col4),'col4'] <- 0
答案 2 :(得分:0)
以下是使用mapply
,
unlist(mapply(`[`, split(df, 1:nrow(df)), max.col(df>0, ties.method = 'first')))
#1.col2 2.col1 3.col1 4.col1
# 1 0 1 1
根据您的需要&#39;向后计数,您可以将ties.method
更改为&#39;最后&#39;,即
unlist(mapply(`[`, split(df, 1:nrow(df)), max.col(df>0, ties.method = 'last')))
#1.col2.1 2.col2.1 3.col1 4.col2.1
# 1 0 1 3
或者反转数据框并将ties.method
保留为&#39;首先,即
unlist(mapply(`[`, split(rev(df), 1:nrow(df)), max.col(df>0, ties.method = 'first')))
# 1.col2 2.col2.1 3.col2.1 4.col2.1
# 1 0 0 3