首页 > 解决方案 > 索引 R 中的非 NA 值以子集 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 值)的位置,然后根据非 NA 的索引创建一个新的数据框。

我目前的代码是:

s <- sapply(!is.na(df$B),  which)

这可以给我一个值列表,表示非 NA 值仅适用于其中一列。但我需要索引 3 列

s <- sapply(!is.na(df$B, df$C, df$D), 2, which)

这段代码给了我错误 is.na(df$B, df$C, df$D) 的错误:3 个参数传递给 'is.na' 这需要 1

我对这个 df 进行索引的预期输出是:

    V1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
8    9

非常感谢生成代码以获取此输出的任何帮助!

2)。然后我想根据生成上述索引进行子集化,我的预期输出 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)

非常感谢生成代码以获得第二个输出的任何帮助,因为我什至不知道从哪里开始编写此代码。

预先感谢您的帮助!

标签: r

解决方案


我们可以which使用arr.ind = TRUE

which(!is.na(df[c("B", "C", "D")]), arr.ind = TRUE)

使用 OP 的代码,我们可能需要遍历matrixby 列

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

如果打算filter在列的行中使用任何非 NA 值,则 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

推荐阅读