R语言 根据列名筛选行

dly7yett  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(193)

我有一个数据集,其中一些列以“Ref”开头。我想选择所有以“Ref”开头的列,并仅在这些列中检查一个条件。不幸的是,由于数据是在另一个步骤中生成的,我不知道有多少列将以“Ref”开头,所有的“Ref”列都包含数字。条件是我想检查列中是否有任何数字不等于3或-1。

Ref_1 <- c(3,3,3,4,3,9)
Ref_2 <- c(-1,-1,-1,-1,8,3)
Ref_3 <- c(3,-1,3,3,3,3)
v1 <- c(2,4,3,1,-1,2)
b1 <- c(2,4,3,1,-1,2)
c1 <- c(2,4,3,1,-1,2)
df <- data.frame(Ref_1,Ref_2, Ref_3, v1, v1, c1)

使用上面的数据集,第4 - 6行应该被条件拾取,因为它失败了。v1,b1和c1中的数据应该被排除,因为它没有以“Ref”开头。
我可以使用if-else语句,但这需要我将“Ref”列硬编码到语句中。我如何使它足够通用,以便它在不知道数据集中所有“Ref”列的情况下挑选出满足该条件的行?

jm81lzqq

jm81lzqq1#

## with dplyr
library(dplyr)
df %>%
  select(starts_with("Ref")) %>%
  filter(if_any(everything(), \(x) !x %in% c(3, -1)))
#   Ref_1 Ref_2 Ref_3
# 1     4    -1     3
# 2     3     8     3
# 3     9     3     3

## with base R
result = df[startsWith(names(df), "Ref")]
result[rowSums(sapply(result, \(x) !x %in% c(3, -1))) > 0, ]
#   Ref_1 Ref_2 Ref_3
# 4     4    -1     3
# 5     3     8     3
# 6     9     3     3
h43kikqp

h43kikqp2#

使用 base

cols <- grep("^Ref*", colnames(df), value = TRUE)
df[ which(rowSums(df[, cols] == 3 | df[, cols] == -1) < 3), cols ]
#   Ref_1 Ref_2 Ref_3
# 4     4    -1     3
# 5     3     8     3
# 6     9     3     3

相关问题