Фильтровать кадр данных на основе входного вектора, содержащего имена столбцов - PullRequest
0 голосов
/ 31 августа 2018

У меня есть датафрейм следующим образом

Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos

A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1
D            0            1          0          0         1

Мне нужно создать функцию, в которой пользователь может вводить имена столбцов в вектор, а информационный кадр будет фильтроваться, где значение в любом из этих столбцов равно 1

Пример: если вход col_nm = c("geo_pos","dol_pos"), то выход, который я ищу,

Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos

A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1

Есть ли эффективный способ сделать это?

Данные

df <- read.table(text="Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos
A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1
D            0            1          0          0         1",h=T)

Ответы [ 5 ]

0 голосов
/ 02 сентября 2018

Вы можете использовать pmax:

df[as.logical(do.call(pmax,df[col_nm])),]

#   Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
# 1        A       1       1       0       0       1
# 2        B       0       1       1       0       0
# 3        C       1       0       1       1       1
0 голосов
/ 31 августа 2018

A base R опция с Reduce

df1[Reduce(`|`, df1[col_nm]),]
#  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
#1        A       1       1       0       0       1
#2        B       0       1       1       0       0
#3        C       1       0       1       1       1
0 голосов
/ 31 августа 2018

с тидверсом:

df %>% filter_at(col_nm,any_vars(.==1))

#  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
#1        A       1       1       0       0       1
#2        B       0       1       1       0       0
#3        C       1       0       1       1       1
0 голосов
/ 31 августа 2018

С plyr:

library(plyr)
unique(ldply(col_nm,.fun = function(x){(df[df[x]==1,])}))

Выход:

     Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
1        A       1       1       0       0       1
2        C       1       0       1       1       1
3        B       0       1       1       0       0

OR

unique(as.data.frame(do.call(rbind, lapply(col_nm, function(x) df[df[x]==1,]))))
0 голосов
/ 31 августа 2018

Мы можем эффективно использовать rowSums здесь для фильтрации строк, у которых есть хотя бы один «1» в выбранных столбцах.

get_one_rows <- function(cols) {
    df[rowSums(df[cols] == 1) > 0, ]
}

col_nm = c("geo_pos","dol_pos")
get_one_rows(col_nm)

# Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
#1        A       1       1       0       0       1
#2        B       0       1       1       0       0
#3        C       1       0       1       1       1


col_nm = c("kol_pos")
get_one_rows(col_nm)

#  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
#1        A       1       1       0       0       1
#3        C       1       0       1       1       1
#4        D       0       1       0       0       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...