通过过滤不等于R中的值的子集来创建多个数据框

时间:2019-05-15 17:29:54

标签: r function dataframe filter lapply

我有一个包含两列“文本”和“颜色”的数据框。

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,它包含除包含“ 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 个答案:

答案 0 :(得分:2)

在函数内部,它是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)
  }

答案 1 :(得分:2)

这是使用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