繁体   English   中英

索引 R 中的非 NA 值以子集化 R 中的新数据框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM