【问题标题】:Index non-NA values in R to subset a new data frame in R索引 R 中的非 NA 值以子集 R 中的新数据帧
【发布时间】:2021-09-29 15:28:20
【问题描述】:

我有一个 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


    【解决方案1】:

    我们可以使用whicharr.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
    

    如果意图是 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
    

    【讨论】:

    • 感谢上面的代码。使用哪个函数的第一个代码适用于生成 df2。我发现 df2
    • @vcat 尝试更新
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 2020-04-07
    • 2014-12-22
    • 2021-06-27
    • 2018-07-07
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多