首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:标识行从列表中包含多个字符的情况

R:标识行从列表中包含多个字符的情况
EN

Stack Overflow用户
提问于 2022-05-04 14:41:38
回答 1查看 27关注 0票数 1

我正在处理一个大型数据集,在这里我需要创建一个新列并分配适当的标签。例如,我有包含水果和蔬菜混合物的行,我想要一个新的列,它将该行标识为水果、蔬菜或混合。理想的结果是:

代码语言:javascript
复制
#     name   type
# 1    apple fruit
# 2    bananas fruit
# 3    kale   vegetable
# 4    apple, kale   mixed

虽然我成功地识别了包含单个“项”的行的类型,但我在为“混合”类型编写代码时遇到了困难。我正在考虑使用和(例如,水果和蔬菜混合)。但这不管用。是否有一种高效/正确的混合实例编码方法?我感谢你的帮助,谢谢!!

现在我要说的是:

代码语言:javascript
复制
df <- data.frame(name = c('apple','bananas','kale','apple, kale'), 
             stringsAsFactors = FALSE)
df$type <- factor(df$name) # First step: copy vector and make it factor

#Change levels:
levels(df$type) <- list(
    fruit = c("apple", "bananas"),
    vegetable = c("kale")
)
EN

回答 1

Stack Overflow用户

发布于 2022-05-04 14:55:42

下面是使用purrrdplyr包的解决方案:

代码语言:javascript
复制
library(dplyr)
library(purrr)

l <- list(
  fruit = c("apple", "bananas"),
  vegetable = c("kale")
)

v <- unlist(l)
nm <- gsub("\\d", "", setNames(names(v), v))

df %>%
  mutate(type = map_chr(strsplit(name, ", "), ~ if (n_distinct(nm[.x]) > 1) "mixed" else nm[.x]))

输出

代码语言:javascript
复制
         name      type
1       apple     fruit
2     bananas     fruit
3        kale vegetable
4 apple, kale     mixed

是如何工作的

  1. 创建一个命名向量,以帮助将name转换为type。例如,fruit.
  2. Then返回name,我们将name拆分成一个列表:

代码语言:javascript
复制
strsplit(df$name, ", ")
[[1]]
[1] "apple"

[[2]]
[1] "bananas"

[[3]]
[1] "kale"

[[4]]
[1] "apple" "kale" 

  1. 最后,我们在这个列表上映射一个purrr样式函数。如果返回的唯一类型的数量大于一个,则值为mixed,否则将从命名向量mixed返回该值。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72114917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档