[英]R: Return rows with only 1 non-NA value for a set of columns
假設我有一個包含以下數據的 data.table:
colA colB colC result
1 2 3 231
1 NA 2 123
NA 3 NA 345
11 NA NA 754
我將如何使用dplyr
和magrittr
只選擇以下行:
colA colB colC result
NA 3 NA 345
11 NA NA 754
選擇標准是:AC 列只有 1 個非 NA 值(即colA, colB, ColC
)
我一直找不到類似的問題; 猜測這是一個奇怪的情況。
一個基本的 R 選項是
df[apply(df, 1, function(x) sum(!is.na(x)) == 1), ]
# colA colB colC
#3 NA 3 NA
#4 11 NA NA
dplyr
選項是
df %>% filter(rowSums(!is.na(.)) == 1)
為了回應你的評論,你可以做
df[apply(df[, -ncol(df)], 1, function(x) sum(!is.na(x)) == 1), ]
# colA colB colC result
#3 NA 3 NA 345
#4 11 NA NA 754
或在dplyr
相同
df %>% filter(rowSums(!is.na(.[-length(.)])) == 1)
這假設最后一列是您要忽略的列。
df <-read.table(text = "colA colB colC
1 2 3
1 NA 2
NA 3 NA
11 NA NA", header = T)
df <- read.table(text =
"colA colB colC result
1 2 3 231
1 NA 2 123
NA 3 NA 345
11 NA NA 754
", header = T)
另一種選擇是用map
filter
library(dplyr)
library(purrr)
df %>%
filter(map(select(., starts_with('col')), ~ !is.na(.)) %>%
reduce(`+`) == 1)
# colA colB colC result
#1 NA 3 NA 345
#2 11 NA NA 754
或者另一種選擇是使用transmute_at
df %>%
transmute_at(vars(starts_with('col')), ~ !is.na(.)) %>%
reduce(`+`) %>%
magrittr::equals(1) %>% filter(df, .)
# colA colB colC result
#1 NA 3 NA 345
#2 11 NA NA 754
df <- structure(list(colA = c(1L, 1L, NA, 11L), colB = c(2L, NA, 3L,
NA), colC = c(3L, 2L, NA, NA), result = c(231L, 123L, 345L, 754L
)), class = "data.frame", row.names = c(NA, -4L))
我認為這可以通過filter_at
實現,但我無法使其工作。 這是使用filter
和pmap_lgl
一種嘗試,您可以在其中指定select
的列范圍或通過它們的位置指定或使用其他 tidyselect 輔助變量。
library(dplyr)
library(purrr)
df %>%
filter(pmap_lgl(select(., colA:colC), ~sum(!is.na(c(...))) == 1))
# colA colB colC result
#1 NA 3 NA 345
#2 11 NA NA 754
數據
df <- structure(list(colA = c(1L, 1L, NA, 11L), colB = c(2L, NA, 3L,
NA), colC = c(3L, 2L, NA, NA), result = c(231L, 123L, 345L, 754L
)), class = "data.frame", row.names = c(NA, -4L))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.