Одна tidyverse
возможность может быть:
df %>%
gather(var, val, -c(5:6)) %>%
group_by(var) %>%
summarise(res = any(val[!is.na(val)] > -10 & val[!is.na(val)] < 0))
var res
<chr> <lgl>
1 A TRUE
2 B FALSE
3 D TRUE
4 E FALSE
Чтобы выбрать только числовые столбцы:
df %>%
select_if(is.numeric) %>%
gather(var, val) %>%
group_by(var) %>%
summarise(res = any(val[!is.na(val)] > -10 & val[!is.na(val)] < 0))
Обратите внимание, что он также выбирает столбец "год", поскольку он является числовым столбцом.
Вы можете сделать это также с помощью base R
:
df <- Filter(is.numeric, df)
cond <- as.logical(colSums(df > -10, na.rm = TRUE) *
colSums(df < -0, na.rm = TRUE))
colnames(df[, cond])
[1] "A" "D"
или записанным в виде «одной строки»:
df <- Filter(is.numeric, df)
colnames(df[, as.logical(colSums(df > -10, na.rm = TRUE) * colSums(df < -0, na.rm = TRUE))])
Пример данных:
df <- read.table(text =
"A B D E iso year
0 1 1 NA ECU 2009
1 0 2 0 ECU 2009
0 0 -3 0 BRA 2011
1 0 4 0 BRA 2011
0 1 7 NA ECU 2008
-1 0 1 0 ECU 2008
0 0 3 2 BRA 2012
1 0 4 NA BRA 2012",
header = TRUE,
stringsAsFactors = FALSE)