【发布时间】:2017-11-29 13:12:10
【问题描述】:
我的数据框中有一列是字符列表。这是专栏categories
str(df)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 4 obs. of 3 variables:
$ categories:List of 4
..$ : chr "Tex-Mex" "Mexican" "Fast Food" "Restaurants"
..$ : chr "Hawaiian" "Restaurants" "Barbeque"
..$ : chr "Restaurants" "Italian" "Seafood"
..$ : chr "Restaurants" "Mexican" "American (Traditional)"
$ name : chr "Taco Bell" "Ohana Hawaiian BBQ" "Carrabba's Italian Grill" "Don Tequila"
$ type : chr "business" "business" "business" "business"
这是前四行的dput:
structure(list(categories = list(c("Tex-Mex", "Mexican", "Fast Food",
"Restaurants"), c("Hawaiian", "Restaurants", "Barbeque"), c("Restaurants",
"Italian", "Seafood"), c("Restaurants", "Mexican", "American (Traditional)"
)), name = c("Taco Bell", "Ohana Hawaiian BBQ", "Carrabba's Italian Grill",
"Don Tequila"), type = c("business", "business", "business",
"business")), row.names = c(NA, -4L), class = c("tbl_df", "tbl",
"data.frame"), .Names = c("categories", "name", "type"))
我想从该列表中提取一些值,以便这些值是唯一保留在该向量中的值。
例如,我想过滤掉所有不是“墨西哥”和“餐厅”的值。所以剩下的唯一值是“墨西哥”和“餐厅”。为此,我尝试了以下解决方案:
df_test <- df %>% unnest(categories) %>%
filter(str_detect(categories, "Mexican")
(str_detect(categories, "Restaurants")) %>%
nest(categories)
但是结果是这样的:
str(df_test)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 4 obs. of 3 variables:
$ name: chr "Taco Bell" "Ohana Hawaiian BBQ" "Carrabba's Italian Grill" "Don Tequila"
$ type: chr "business" "business" "business" "business"
$ data:List of 4
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 2 obs. of 1 variable:
.. ..$ categories: chr "Mexican" "Restaurants"
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 1 variable:
.. ..$ categories: chr "Restaurants"
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 1 variable:
.. ..$ categories: chr "Restaurants"
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 2 obs. of 1 variable:
.. ..$ categories: chr "Restaurants" "Mexican"
问题是,在那之后,该列就没有像 type 列那样的字符向量了。
是否有可能过滤掉这些字符,以便在该过程之后该列是一个正常的字符向量,如 name 和 type 列?
我不想替换通过此过程删除的值/行。因此,如果某一行中没有“墨西哥”或“餐厅”,则该行将被删除。
使用过的包:
dplyr
stringr
【问题讨论】:
-
请包括您正在使用的所有软件包...不仅仅是
dplyr -
另外,您最好添加一个更完整的数据集(一个或两个附加变量),并为该数据集提供您想要的结果。例如,不清楚是要删除此列中所有不包含“墨西哥”的行,还是要将该值替换为 NA。
-
你为什么在那里使用
str_detect?你可以简单地做df %>% unnest() %>% filter(categories == 'Mexican') -
我想过滤掉多个值。如果我这样做,一些行将成倍增加。
-
那么
df %>% unnest() %>% filter(categories %in% c('Mexican', 'Restaurants'))