data.frame:查找每行中值的最后一个索引

时间:2015-07-30 12:03:51

标签: r dataframe

我有data.frame喜欢

  a b c d
1 1 0 0 1
2 1 1 0 0
3 0 1 0 0
4 1 0 1 0
5 1 0 0 0

我使用

生成的
df<- data.frame(a=sample(0:1,5,replace=T),b=sample(0:1,5,replace=T),c=sample(0:1,5,replace=T),d=sample(0:1,5,replace=T))

如果我将1传递给描述每行中最后一个索引为1的函数,我怎样才能得到4, 2, 2, 3, 1的结果。

4 个答案:

答案 0 :(得分:4)

一种方法是:

apply(df, 1, function(x) max(which(x == 1)))

如果您希望对要检查的元素保持灵活性并处理行中缺少值的情况:

max.row <- function(df, val) unname(apply(df, 1, function(x) tail(c(NA, which(x == val)), 1)))
max.row(df, 0)
# [1] 3 4 4 4
max.row(df, 1)
# [1] 4 2 2 3
max.row(df, 2)
# [1] NA NA NA NA

答案 1 :(得分:4)

您可以尝试max.col,这比apply

快一点
max.col(df, "last")
# [1] 2 4 4 2 4

数据

set.seed(1)
df <- data.frame(a=sample(0:1,5,replace=T),b=sample(0:1,5,replace=T),c=sample(0:1,5,replace=T),d=sample(0:1,5,replace=T))

答案 2 :(得分:4)

另一种选择是使用pmax。我们将col(df)乘以&#39; df&#39;并按行获取max值。

  do.call(pmax,col(df)*df)
  #[1] 4 2 2 3 1

col(df)是获取数据集的列索引的便捷函数。

  col(df)
  #     [,1] [,2] [,3] [,4]
  #[1,]    1    2    3    4
  #[2,]    1    2    3    4
  #[3,]    1    2    3    4
  #[4,]    1    2    3    4
  #[5,]    1    2    3    4

通过对&#39; df&#39;进行乘法运算。与col(df)相同的维度,&#39; 0&#39;当#1;&#39; 1的位置时,值将保持为0将被列索引替换,即

 col(df)*df
 #  a b c d
 #1 1 0 0 4
 #2 1 2 0 0
 #3 0 2 0 0
 #4 1 0 3 0
 #5 1 0 0 0

现在,我们可以按max

获得每行的do.call(pmax)

答案 3 :(得分:0)

看到所有可能的解决方案和一个来自我的方面,这里是每次重复10,000次的时间

apply(df,1,function(x){tail(which(x==1),1)})
user  system elapsed
2.978  0.010  2.988


apply(df*col(df),1,function(x){max(x)})
user  system elapsed
8.217  0.026  8.245



apply(df, 1, function(x) max(which(x == 1)))
user  system elapsed
1.621  0.005  1.627


max.col(df, "last")
user  system elapsed
1.348  0.004  1.352

虽然@Mamoun Benghezal的答案是最有效的,但它并没有解决我灵活的目的。接受的答案是。