我有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
的结果。
答案 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的答案是最有效的,但它并没有解决我灵活的目的。接受的答案是。