r - 索引 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)
非常感谢生成代码以获得第二个输出的任何帮助,因为我什至不知道从哪里开始编写此代码。
预先感谢您的帮助!
解决方案
我们可以which
使用arr.ind = TRUE
which(!is.na(df[c("B", "C", "D")]), arr.ind = TRUE)
使用 OP 的代码,我们可能需要遍历matrix
by 列
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
推荐阅读
- mysql - 在 PhpMyAdmin 中执行“If”语句
- google-apps-script - 谷歌工作表 API 值批量更新,正文中的范围数限制
- mysql - MySql加入并计算记录数
- opengl - OpenGL几何着色器,设置输入大小
- python - 如果用户名和密码存储在数据库中,为什么 user.is_active 为 false?
- java - 是否需要在 module-info.java 和 build.gradle.kts 中指定模块依赖项
- python - 具有空间切片问题的字符串
- php - 无法将 Laravel 与 Pusher 连接起来
- java - 有没有办法将 HashMap 的所有值放入数组中?
- java - 将数字转换为 1 的最小操作