【问题标题】:Extract certain characters from list and convert them into a character vector从列表中提取某些字符并将它们转换为字符向量
【发布时间】: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 列那样的字符向量了。

是否有可能过滤掉这些字符,以便在该过程之后该列是一个正常的字符向量,如 nametype 列? 我不想替换通过此过程删除的值/行。因此,如果某一行中没有“墨西哥”或“餐厅”,则该行将被删除。

使用过的包: dplyr stringr

【问题讨论】:

  • 请包括您正在使用的所有软件包...不仅仅是dplyr
  • 另外,您最好添加一个更完整的数据集(一个或两个附加变量),并为该数据集提供您想要的结果。例如,不清楚是要删除此列中所有不包含“墨西哥”的行,还是要将该值替换为 NA。
  • 你为什么在那里使用str_detect?你可以简单地做df %&gt;% unnest() %&gt;% filter(categories == 'Mexican')
  • 我想过滤掉多个值。如果我这样做,一些行将成倍增加。
  • 那么df %&gt;% unnest() %&gt;% filter(categories %in% c('Mexican', 'Restaurants'))

标签: r list dplyr stringr


【解决方案1】:

使用lapply 对列表进行子集化

lapply(df1$categories, function(x) x[x %in% c("Mexican", "Restaurants")])

[[1]]
[1] "Mexican"     "Restaurants"

[[2]]
[1] "Restaurants"

[[3]]
[1] "Restaurants"

[[4]]
[1] "Restaurants" "Mexican"

添加没有匹配条件的行来过滤行

df1 <- rbind(df1, c(list("Nothing to match"), "drop me", "business"))
df1$categories <- lapply(df1$categories, function(x) x[x %in% c("Mexican", "Restaurants")])
df1[sapply(df1$categories, length) > 0, ]

将列表折叠成字符串

df1$categories <- sapply(df1$categories, function(x) paste(sort(x[x %in% c("Mexican", "Restaurants")]), collapse=" "))
df1[nchar(df1$categories) > 0, ]

# A tibble: 4 x 3
           categories                     name     type
                <chr>                    <chr>    <chr>
1 Mexican Restaurants                Taco Bell business
2         Restaurants       Ohana Hawaiian BBQ business
3         Restaurants Carrabba's Italian Grill business
4 Mexican Restaurants              Don Tequila business

【讨论】:

  • THX,它可以工作,但向量仍然是一个列表,而不是一个字符。
  • @Banjo 是否要将所有剩余条目粘贴到单个字符串中?
  • 是的,字符应该是一个向量。
  • @Banjo 添加了将列表折叠成单个字符串的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2015-01-29
  • 2016-04-10
  • 2021-12-17
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多