gpt4 book ai didi

r - 将购物 list 分为多列

转载 作者:行者123 更新时间:2023-12-04 10:13:52 26 4
gpt4 key购买 nike

我有一个像这样的购物 list 数据:

df <- data.frame(id = 1:5, item = c("apple2milk5", "milk1", "juice3apple5", "egg10juice1", "egg8milk2"), stringsAsFactors = F)

# id item
# 1 1 apple2milk5
# 2 2 milk1
# 3 3 juice3apple5
# 4 4 egg10juice1
# 5 5 egg8milk2

我想将 item变量分成多列,并记录商品后面的数字。我遇到的问题是每个人购买的商品都不相同,因此我无法使用 tidyr::separate()或其他类似功能来解决它​​。我期望的是:
#   id apple milk  juice egg  
# 1 1 2 5 NA NA
# 2 2 NA 1 NA NA
# 3 3 5 NA 3 NA
# 4 4 NA NA 1 10
# 5 5 NA 2 NA 8

注意:市场上的商品类别未知。因此,不要以为只有4种商品。

感谢您的帮助!

最佳答案

我将再添加一个答案。它与@ASuliman的区别仅稍有不同,但是使用了一些较新的tidyr和一些可爱的正则表达式使它变得更加简单。

正则表达式的诀窍是,"(?<=\\d)\\B(?=[a-z])"模式将匹配数字和字母之间的无边界(即空位置),从而允许您为每种"apple5"类型的条目创建行。将字母提取到项目列中,将数字提取到计数列中。使用替换pivot_wider的新spread,您可以在整形时将这些计数转换为数值。

library(dplyr)
library(tidyr)

df %>%
separate_rows(item, sep = "(?<=\\d)\\B(?=[a-z])") %>%
extract(item, into = c("item", "count"), regex = "^([a-z]+)(\\d+)$") %>%
pivot_wider(names_from = item, values_from = count, values_fn = list(count = as.numeric))
#> # A tibble: 5 x 5
#> id apple milk juice egg
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2 5 NA NA
#> 2 2 NA 1 NA NA
#> 3 3 5 NA 3 NA
#> 4 4 NA NA 1 10
#> 5 5 NA 2 NA 8

关于r - 将购物 list 分为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58822320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com