2015-12-08 2 views
2

Как фильтровать фрейм данных на основе определенных столбцов. Итак, я хочу найти столбцы с 'Test' в их colname Затем отфильтруйте их, чтобы сохранить только те, которые имеют определенное значение.dplyr фильтр для определенных значений на основе имен столбцов

# Temp Data 
df <- as.data.frame(matrix(seq(1:40),ncol=10,nrow=40)) 
colnames(df) <- c("V1", "V2", "V3 - Test", "V4 - Test", "V5", "V6", "V7", "V8", "V9 - Test", "V10") 

# What I thought would work 
library(dplyr) 

df %>% 
    filter(grepl("Test", colnames(df)) == 40) %>% 
    select(-contains("Test")) 

Обратите внимание, что в реальном наборе данных имеется около 40 столбцов и 30 тыс. Строк.

ответ

1

Мы можем попробовать

df[!rowSums(df[grepl("Test", names(df))]!=40),] 

Или с помощью dplyr

library(dplyr) 
library(magrittr) 
df %>% 
    mutate(ind =!rowSums(.[grep('Test', names(.))]!=40)) %>% 
    .$ind %>% 
    extract(df, .,) 
# V1 V2 V3 - Test V4 - Test V5 V6 V7 V8 V9 - Test V10 
# 40 40 40  40  40 40 40 40 40  40 40 
+0

dplyr путь дает мне: Ошибка в extract_.data.frame (данные, седловины, в, регулярное выражение = регулярное выражение, удалить = удаляете: аргумент "в" отсутствует, не по умолчанию – KillerSnail

+0

@KillerSnail I – akrun

+0

@KillerSnail Пожалуйста, проверьте, загружена ли библиотека 'tidyr''. В этом случае используйте'. $ ind%>% magrittr :: extract (df,.,) ' – akrun

1

перепрофилирования также будет работать.

library(dplyr) 
library(tidyr) 

df_ID = df %>% mutate(ID = 1:n()) 

df_ID %>% 
    select(contains("Test"), ID) %>% 
    gather(variable, value, -ID) %>% 
    filter(value == 40) %>% 
    semi_join(df_ID)