根据条件,每行中第一次出现的位置

时间:2018-10-03 15:24:12

标签: r

我有下表,其中包含有序的变量:

table <- data.frame(Ident = c("Id_01", "Id_02", "Id_03", "Id_04", "Id_05", "Id_06"), 
                    X01 = c(NA, 18, 0, 14, 0, NA), 
                    X02 = c(0, 16, 0, 17, 0, 53), 
                    X03 = c(NA, 15, 20, 30, 0, 72), 
                    X04 = c(0, 17, 0, 19, 0, NA), 
                    X05 = c(NA, 29, 21, 23, 0, 73), 
                    X06 = c(0, 36, 22, 19, 0, 55))

Ident   X01 X02 X03 X04 X05 X06
Id_01   NA  0   NA  0   NA  0
Id_02   18  16  15  17  29  36
Id_03   0   0   20  0   21  22
Id_04   14  17  30  19  23  19
Id_05   0   0   0   0   0   0
Id_06   NA  53  72  NA  73  55

我想为每个Ident查找何时根据特定条件出现第一次。例如,两个连续数字> 0:

  

对于Id_01:从不发生(不适用?)

     

对于Id_02:第1个位置(X01)

     

对于Id_03:第5个位置(X05)

     

对于Id_04:第1个位置(X01)

     

对于ID_05:从不发生(不适用?)

     

对于ID_06:第二个位置(X02)

我正在尝试查找位置编号或该位置的变量名称。


编辑: 我想在下面发布的apply解决方案中添加第二个条件,因此条件必须是:

  1. 第一次和第二次发生(连续)> 0 OR

  2. 第一次和第三次出现> 0

考虑到此更改,之前发布的表的评估结果应为:

  

对于Id_01:从不发生(不适用?)

     

对于Id_02:第1个位置(X01)

     

对于Id_03:第3个位置(X03)-不是X05

     

对于Id_04:第1个位置(X01)

     

对于ID_05:从不发生(不适用?)

     

对于ID_06:第二个位置(X02)

谢谢!

2 个答案:

答案 0 :(得分:4)

我们可以使用apply遍历各行,创建一个逻辑表达式,以检查数字是否大于0或不适用NA('i1')。然后,通过删除第一个和最后一个元素(即检查两个TRUE)来比较相邻的两个元素,并使用which获得索引。用它来获取列名

apply(table[-1], 1, function(x) {
    i1 <- x > 0 & !is.na(x)
    names(x)[which(i1[-1] & i1[-length(i1)])[1]]})
#[1] NA    "X01" "X05" "X01" NA    "X02"

答案 1 :(得分:1)

获取该位置的变量名称的一种方法:

library(magrittr)
apply(!is.na(table[-1]) & table[-1] > 0, 1, 
      function(x) ave(x, cumsum(x == 0), FUN = cumsum)) %>%
  apply(2, function(x) names(table)[which(x == 2)[1]])

[1] NA    "X01" "X05" "X01" NA    "X02"

或索引:

apply(!is.na(table[-1]) & table[-1] > 0, 1, 
      function(x) ave(x, cumsum(x == 0), FUN = cumsum)) %>%
  apply(2, function(x) which(x == 2)[1] - 1L)

[1] NA  1  5  1 NA  2