创建新列以标识不同列中的第一个值> 0

时间:2017-11-16 07:50:04

标签: r

我有以下数据框

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
  }

3 个答案:

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