簡體   English   中英

R:為一組列返回只有 1 個非 NA 值的行

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

我將如何使用dplyrmagrittr只選擇以下行:

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實現,但我無法使其工作。 這是使用filterpmap_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM