提取第一个非零元素为1的行

时间:2014-07-24 13:49:08

标签: r

我想从第一个非零元素为my.data的数据框1中提取每一行。

my.data <- read.table(text = '

     x1 x2 x3 x4
      0  0  1  1
      0  0  0  1
      0  2  1  1
      2  1  2  1
      1  1  1  2
      0  0  0  0
      0  1  0  0
', header = TRUE)

my.data

desired.result <- read.table(text = '

     x1 x2 x3 x4
      0  0  1  1
      0  0  0  1
      1  1  1  2
      0  1  0  0
', header = TRUE)

desired.result

我甚至不确定从哪里开始。对不起,如果这是重复的。感谢您提出任何建议或意见。

3 个答案:

答案 0 :(得分:3)

这是一种方法:

# index of rows
idx <- apply(my.data, 1, function(x) any(x) && x[as.logical(x)][1] == 1)

# extract rows
desired.result <- my.data[idx, ]

结果:

  x1 x2 x3 x4
1  0  0  1  1
2  0  0  0  1
5  1  1  1  2
7  0  1  0  0

答案 1 :(得分:1)

  1. 使用apply迭代所有行:

    first.element.is.one <- apply(my.data, 1, function(x) x[x != 0][1] == 1)
    

    传递给apply的函数将[1]的第一个[x != 0]非零x元素与== 1进行比较。每行将调用一次,x将是您示例中的四个向量。

  2. 使用which提取候选行的索引(并删除NA值):

    desired.rows <- which(first.element.is.one)
    
  3. 选择矩阵的行 - 您可能知道如何执行此操作。

  4. 加分问题:第2步中提到的NA值来自何处?

答案 2 :(得分:1)

可能不是最好的答案,但是:

rows.to.extract <- apply(my.data, 1, function(x) {
  no.zeroes <- x[x!=0]  # removing 0
  to.return <- no.zeroes[1] == 1     # finding if first number is 0

  # if a row is all 0, then to.return will be NA
  # this fixes that problem
  to.return[is.na(to.return)] <- FALSE # if row is all 0

  to.return
})
my.data[rows.to.extract, ]

  x1 x2 x3 x4
1  0  0  1  1
2  0  0  0  1
5  1  1  1  2
7  0  1  0  0