如果名称列包含部分值,则保留行
If column with name contains partial value, keep rows
我有一个数据集:
Camp1 Ade2 Camp3 Ade4
dA 1 eB 2
dB 4 uC 8
gB 3 NA NA
如果名称中包含 "Camp" 的列名称不包含值 "A" 或 "B" 或 NA,我如何对该数据集进行子集化,排除这些行。
我知道如何进行完全匹配但不是部分匹配。
cols = grepl("Camp", names(df))
rows = rowSums(df[, cols] == "A" |
df[, cols] == "B" |
is.na(df[, cols])) == sum(cols)
df<-df[rows, ]
如何进行等效但部分匹配的操作?
预期输出:
Camp1 Ade2 Camp3 Ade4
dA 1 eB 2
gB 3 NA NA
我们可以使用 dplyr
中的 filter_at
。使用 starts_with
辅助函数,我们将过滤器应用于以 'Camp'
开头的每一列。在这些列上,我们过滤 all_vars
包含 A
或 B
或 NA
:
的行
library(dplyr)
df %>%
filter_at(vars(starts_with("Camp")), all_vars(grepl('A|B', .) | is.na(.)))
输出:
Camp1 Ade2 Camp3 Ade4
1 dA 1 eB 2
2 gB 3 <NA> NA
数据:
df <- structure(list(Camp1 = structure(1:3, .Label = c("dA", "dB",
"gB"), class = "factor"), Ade2 = c(1L, 4L, 3L), Camp3 = structure(c(1L,
2L, NA), .Label = c("eB", "uC"), class = "factor"), Ade4 = c(2L,
8L, NA)), class = "data.frame", row.names = c(NA, -3L))
这是一个 tidyverse 风格的解决方案。
使用filter_at
:
my_df %>%
filter_at(vars(matches('Camp')), all_vars(is.na(.) | str_detect(., 'A|B')))
这里,vars(matches('Camp'))
表示过滤名称包含字符串Camp
的列,all_vars(...)
表示只保留all[=26]的行=] 列 [匹配 'Camp'] 符合指定条件。
你需要做 require(tidyverse)
和 require(stringr)
才能工作。
使用 base R 你可以试试:
df_cols <- df[, grepl("Camp", names(df))]
df[apply(df_cols, 1, function(x) all(grepl("A|B", x) | is.na(x))), ]
Camp1 Ade2 Camp3 Ade4
1 dA 1 eB 2
3 gB 3 <NA> NA
第一步,它识别名称中包含 "Camp" 的列,然后根据给定条件对数据进行子集化。
我有一个数据集:
Camp1 Ade2 Camp3 Ade4
dA 1 eB 2
dB 4 uC 8
gB 3 NA NA
如果名称中包含 "Camp" 的列名称不包含值 "A" 或 "B" 或 NA,我如何对该数据集进行子集化,排除这些行。
我知道如何进行完全匹配但不是部分匹配。
cols = grepl("Camp", names(df))
rows = rowSums(df[, cols] == "A" |
df[, cols] == "B" |
is.na(df[, cols])) == sum(cols)
df<-df[rows, ]
如何进行等效但部分匹配的操作?
预期输出:
Camp1 Ade2 Camp3 Ade4
dA 1 eB 2
gB 3 NA NA
我们可以使用 dplyr
中的 filter_at
。使用 starts_with
辅助函数,我们将过滤器应用于以 'Camp'
开头的每一列。在这些列上,我们过滤 all_vars
包含 A
或 B
或 NA
:
library(dplyr)
df %>%
filter_at(vars(starts_with("Camp")), all_vars(grepl('A|B', .) | is.na(.)))
输出:
Camp1 Ade2 Camp3 Ade4
1 dA 1 eB 2
2 gB 3 <NA> NA
数据:
df <- structure(list(Camp1 = structure(1:3, .Label = c("dA", "dB",
"gB"), class = "factor"), Ade2 = c(1L, 4L, 3L), Camp3 = structure(c(1L,
2L, NA), .Label = c("eB", "uC"), class = "factor"), Ade4 = c(2L,
8L, NA)), class = "data.frame", row.names = c(NA, -3L))
这是一个 tidyverse 风格的解决方案。
使用filter_at
:
my_df %>%
filter_at(vars(matches('Camp')), all_vars(is.na(.) | str_detect(., 'A|B')))
这里,vars(matches('Camp'))
表示过滤名称包含字符串Camp
的列,all_vars(...)
表示只保留all[=26]的行=] 列 [匹配 'Camp'] 符合指定条件。
你需要做 require(tidyverse)
和 require(stringr)
才能工作。
使用 base R 你可以试试:
df_cols <- df[, grepl("Camp", names(df))]
df[apply(df_cols, 1, function(x) all(grepl("A|B", x) | is.na(x))), ]
Camp1 Ade2 Camp3 Ade4
1 dA 1 eB 2
3 gB 3 <NA> NA
第一步,它识别名称中包含 "Camp" 的列,然后根据给定条件对数据进行子集化。