我想从第一个非零元素为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
我甚至不确定从哪里开始。对不起,如果这是重复的。感谢您提出任何建议或意见。
答案 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)
使用apply
迭代所有行:
first.element.is.one <- apply(my.data, 1, function(x) x[x != 0][1] == 1)
传递给apply
的函数将[1]
的第一个[x != 0]
非零x
元素与== 1
进行比较。每行将调用一次,x
将是您示例中的四个向量。
使用which
提取候选行的索引(并删除NA
值):
desired.rows <- which(first.element.is.one)
选择矩阵的行 - 您可能知道如何执行此操作。
加分问题:第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