R:为数据帧的每一行查找满足特定条件的最后一个值的位置
我有一个看起来像这样的数据框: M0 M1 M2 M3 M4 M5 M6 M7 M8 1 1 0 0 0 NA NA NA NA 2 2 2 2 2 2 2 0 0 2 2 2 2 2 0 NA NA NA 2 2 2 2 2 0 0 0 0 M0 M1 M2 M3 M4 M5 M6 M7 M8 1 100 0 0纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳 2 2 2 2 2 2 2 0 0 2 2 0钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠 2 2 2 2 2 0 0 0 0 我想知道的是每行中最后一个大于0的值的位置(列) 所需的输出将是包含这些索引位置的向量R:为数据帧的每一行查找满足特定条件的最后一个值的位置,r,R,我有一个看起来像这样的数据框: M0 M1 M2 M3 M4 M5 M6 M7 M8 1 1 0 0 0 NA NA NA NA 2 2 2 2 2 2 2 0 0 2 2 2 2 2 0 NA NA NA 2 2 2 2 2 0 0 0 0 M0 M1 M2 M3 M4 M5 M6 M7 M8 1 100 0 0纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳
此处:(M1、M6、M4、M4)一种解决方案是从宽格式改为长格式,并根据行id选择最右边的,即最后一列>0:
library(data.table)
melt(setDT(DF)[, rn := .I], id.vars = "rn", na.rm = TRUE)[
value > 0, last(variable), by = rn]
如果只需要向量,请执行以下操作:
melt(setDT(DF)[, rn := .I], id.vars = "rn", na.rm = TRUE)[
value > 0, last(variable), by = rn][, V1]
下面是使用
apply
可以执行的操作。基本上,apply中的函数按行查找大于0的数据,使用tail(x,1)
查找最后一个数据,并查找相应的列名
df <- read.table(text="M0 M1 M2 M3 M4 M5 M6 M7 M8
1 1 0 0 0 NA NA NA NA
2 2 2 2 2 2 2 0 0
2 2 2 2 2 0 NA NA NA
2 2 2 2 2 0 0 0 0",header=TRUE, stringsAsFactors=FALSE)
names(df)[apply(df, 1, function(x) tail(which(x > 0), 1))]
[1] "M1" "M6" "M4" "M4"
df 0),1)]
[1] “M1”“M6”“M4”“M4”
您可以使用max.col
names(df)[max.col(!is.na(df) & df > 0, ties.method = "last")]
# [1] "M1" "M6" "M4" "M4"
你能给出所需的输出吗?我不太明白你的意思。我补充了我对所提供的示例的预期结果:谢谢。这是可行的,但对于仅由零组成的行返回NA。由于Henrik的解决方案只是返回最后一列,因此它更适合我的目的。但是我没有在我的问题中详细说明这一点,所以你没有办法知道。谢谢完美的工作起来很有魅力!
df <- read.table(text="M0 M1 M2 M3 M4 M5 M6 M7 M8
1 1 0 0 0 NA NA NA NA
2 2 2 2 2 2 2 0 0
2 2 2 2 2 0 NA NA NA
2 2 2 2 2 0 0 0 0",header=TRUE, stringsAsFactors=FALSE)
names(df)[apply(df, 1, function(x) tail(which(x > 0), 1))]
[1] "M1" "M6" "M4" "M4"
names(df)[max.col(!is.na(df) & df > 0, ties.method = "last")]
# [1] "M1" "M6" "M4" "M4"