我有一个包含两列“文本”和“颜色”的数据框。
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
在这种情况下,您能帮我还是指出如何进行应用/映射/循环?
谢谢!
答案 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