[英]Index non-NA values in R to subset a new data frame in R
我有一个 df:
A <- c("a", "b", "c", "d", "e", "f", "g", "NA", "h", "I")
B <- c(NA, 2, 3, 4, NA, NA, 5, 6, 8, NA)
C <- c(NA, 9, 8, 4, 5, 7, 5, 6, NA, NA)
D <- c(NA, 1, 2, 3, NA, 5, NA, 7, 8, NA)
E <- c(1,2,3,4,5,6,7,8,9,10)
df <- data.frame(A, B, C, D, E)
1). 我想确定 B 列 C、D 中数值(非 NA 值)的 position,然后根据非 NA 的索引创建一个新的数据框。
我当前的代码是:
s <- sapply(!is.na(df$B), which)
这可以给我一个值列表,指示非 NA 值仅用于其中一列的位置。 但我需要索引 3 列
s <- sapply(!is.na(df$B, df$C, df$D), 2, which)
这段代码给我错误 Error in is.na(df$B, df$C, df$D): 3 arguments passed to 'is.na' which requires 1
我预期用于索引此 df 的 output 是:
V1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
在生成代码以获取此 output 方面的任何帮助将不胜感激!
2). 然后我想根据生成上述索引进行子集化,我预期的 output df2 将是:
A <- c("b", "c", "d", "e", "f", "g", NA, "h")
B <- c(2,3,4,NA, NA, 5,6, 8)
C <- c(9, 8, 4, 5, 7, 5, 6, NA)
D <- c(1,2,3,NA, 5, NA, 7, 8)
E <- c(2,3,4,5,6,7,8,9)
df2 <- data.frame(A, B, C, D, E)
在生成代码以获取第二个 output 方面的任何帮助将不胜感激,因为我什至不知道从哪里开始编写此代码。
预先感谢您的帮助!
我们可以使用which
with arr.ind = TRUE
which(!is.na(df[c("B", "C", "D")]), arr.ind = TRUE)
使用OP的代码,我们可能需要按列遍历matrix
apply(!is.na(df[c("B", "C", "D")]), 2, which)
-输出
$B
[1] 2 3 4 7 8 9
$C
[1] 2 3 4 5 6 7 8
$D
[1] 2 3 4 6 8 9
如果打算用行中的任何非 NA 值filter
列,B 到 D
library(dplyr)
df %>%
filter(if_any(B:D, ~ !is.na(.)))
A B C D E
1 b 2 9 1 2
2 c 3 8 2 3
3 d 4 4 3 4
4 e NA 5 NA 5
5 f NA 7 5 6
6 g 5 5 NA 7
7 NA 6 6 7 8
8 h 8 NA 8 9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.