根据R中多列的值删除行

问题描述 投票:0回答:3

在我的数据中,如果三列(V1、V2、V3)中的值是 12 和 NA 的组合(如第 2 行)或所有三列都等于 12(如第 5 行),我需要删除这些行。请注意,如果所有值都等于 NA(如第 3 行),它应该保留在数据中。

df <- data.frame(
  "V1" = c(NA, NA, NA, 12, 12),
  "V2" = c(55, NA, NA, 14, 12),
  "V3" = c(21, 12, NA, NA, 12),
  "V4" = c(NA, 32, NA, NA, NA),
  "V5" = c(NA, NA, 18, NA, NA)
)
     V1 V2 V3 V4 V5 
1    NA 55 21 NA NA
2    NA NA 12 32 NA
3    NA NA NA NA 18
4    12 14 NA NA NA
5    12 12 12 NA NA

我想要以下结果:

     V1 V2 V3 V4 V5 
1    NA 55 21 NA NA
3    NA NA NA NA 18
4    12 14 NA NA NA

提前感谢您的帮助。

r filter subset
3个回答
1
投票

使用 Tidyverse 语法,保留所有行,其中从列 V1 到 V3 的至少一个条目与 NA 或 12 不同:

library(tidyverse)

df <- tibble(
  "V1" = c(NA, NA, 76, 12),
  "V2" = c(55, NA, NA, 14),
  "V3" = c(21, 12, NA, NA),
  "V4" = c(NA, 32, NA, NA),
  "V5" = c(NA, NA, 12, NA)
)

df |> 
  filter(if_any(
    V1:V3,
    ~ !(is.na(.x) | .x == 12)
  ))
#> # A tibble: 3 × 5
#>      V1    V2    V3    V4    V5
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    NA    55    21    NA    NA
#> 2    76    NA    NA    NA    12
#> 3    12    14    NA    NA    NA

创建于 2023-03-03 与 reprex v2.0.2

更一般地说,要根据多列中的值对行进行子集化,请结合使用

filter()
if_all()
if_any()
助手。


1
投票

首先设置一个

col
变量存储目标列名称。
NA
12
的记录总数应与
length
col
匹配。

col <- c("V1", "V2", "V3")

df[apply(df[, col], 1, \(x) sum((is.na(x) | x == 12), na.rm = T) != length(col)), ]

更新:要删除同时包含

12
NA
或所有值等于
12
的行,请使用以下代码:

df[apply(df[, col], 1, \(x) !((sum((is.na(x) | x == 12), na.rm = T) == length(col)) & 
                               (sum(is.na(x)) >= 1 & sum(x == 12, na.rm = T) >= 1) |
                                sum(x == 12, na.rm = T) == length(col))), ]

输出

  V1 V2 V3 V4 V5
1 NA 55 21 NA NA
3 76 NA NA NA 12
4 12 14 NA NA NA

0
投票

您可以在

filter()
中使用双重条件:

library(dplyr)

df %>%
  filter(!if_all(V1:V3, ~ .x %in% c(12, NA)) | if_all(V1:V3, ~ is.na(.x)))

#   V1 V2 V3 V4 V5
# 1 NA 55 21 NA NA
# 2 NA NA NA NA 18
# 3 12 14 NA NA NA
© www.soinside.com 2019 - 2024. All rights reserved.