Создайте несколько фреймов данных, отфильтровывая подмножества, которые не равны значению в R - PullRequest
1 голос
/ 15 мая 2019

У меня есть датафрейм с двумя столбцами Text и Colours.

library(tidyverse)
library(purrr)

# sample dataframe
df <- data.frame(Text = c("text1", "text2", "text3", "text4"), 
                 Colours = c("blue", "white", "green", "yellow"), stringsAsFactors = F)


Мне нужен фрейм данных, скажем, NOT_Blue, который включает в себя все строки, кроме строк, содержащих «синий». Другими словами, датафрейм со всеми цветами, кроме тех, которые не равны "синему". В конце я хотел бы написать эти кадры данных как CSV-файлы.

Для одного кадра данных с использованием dplyr::filter и != (не равно) будет работать

not_blue <- df %>% filter(!Colours == "blue")

not_blue
   Text Colours
1 text2   white
2 text3   green
3 text4  yellow

Дело в том, что мне нужно создать разные фреймы данных для каждого цвета / категории.

Полагаю, мне нужно будет использовать одну из функций семейства apply / map. Поэтому я создаю вектор с цветами, надеясь использовать его в функции.

# colours to feed the function
colours <- c("blue", "white", "green", "yellow")

# trying to make a function

remaining_colours <- function(x) {

  df <- df %>% filter(!Colours == x)
}


# using the formula with map_df of purrr
map_df(colours, remaining_colours) %>% arrange(Text)

# epic fail results
Text Colours
1  text1    blue
2  text1    blue
3  text1    blue
4  text2   white
5  text2   white
6  text2   white
7  text3   green
8  text3   green
9  text3   green
10 text4  yellow
11 text4  yellow
12 text4  yellow

Не могли бы вы мне помочь или указать, как сделать применение / карту / петлю для этого случая?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Вот способ использования lapply. Это создаст список ваших желаемых фреймов данных.

colours <- c("blue", "white", "green", "yellow")

result <- lapply(colours, function(x) {
             df %>% filter(!Colours == x)
          }) %>% 
          setNames(paste0("NOT_", colours))

result

$NOT_blue
   Text Colours
1 text2   white
2 text3   green
3 text4  yellow

$NOT_white
   Text Colours
1 text1    blue
2 text3   green
3 text4  yellow

$NOT_green
   Text Colours
1 text1    blue
2 text2   white
3 text4  yellow

$NOT_yellow
   Text Colours
1 text1    blue
2 text2   white
3 text3   green
2 голосов
/ 15 мая 2019

Внутри функции это было colours вместо Colours

map_df(colours, ~ df %>% 
                      filter(Colours != .x))

#    Text Colours
#1  text2   white
#2  text3   green
#3  text4  yellow
#4  text1    blue
#5  text3   green
#6  text4  yellow
#7  text1    blue
#8  text2   white
#9  text4  yellow
#10 text1    blue
#11 text2   white
#12 text3   green

Если нам нужно list из data.frame вместо map_df, просто используйте map

set_names(map(colours, ~ df %>% 
                      filter(Colours != .x)), paste0("df_", colours))

Или измените функцию на

remaining_colours <- function(x) {

     df %>% 
         filter(!Colours == x)
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...