r - dplyr 使用 purrr::map 计算小标题列表中的单个观察值
问题描述
我正在尝试计算包含由“;”分隔的单个观察的小标题列表中的出现频率。purrr::map()
使用inside 时遇到错误purrr::map()
。我怀疑我遗漏了一些简单的东西,因此不胜感激。
以不同客户购买水果为例,同一时间购买的水果用“;”隔开。
# Fruit purchases across days with different number of customers.
day_1 <- as_data_frame(setNames(list(c("oranges;peaches;apples", "pears;apples", "bananas", "oranges;apples", "apples")), "fruits"))
day_2 <- as_data_frame(setNames(list(c("oranges;apples", "peaches","apples;bananas;", "pears", "apples;peaches", "oranges")), "fruits"))
day_3 <- as_data_frame(setNames(list(c("peaches;pears","apples","bananas")), "fruits"))
# Create list of fruit purchases.
fruit_list <- list(day_1, day_2, day_3)
这将返回一个包含三个小标题的列表,并且是我的数据的一般格式。dplyr
我可以使用/计算每天每种水果的总观察次数purrr
:
fruit_list %>%
map(function(x) strsplit(x$fruits, ";")) %>%
map(unlist) %>%
map(table)
map()
但是,当我尝试使用 a within a来隔离和统计整个 tibbles 列表中的单个水果购买时,map()
我遇到了错误
“错误:
.x
不是向量(闭包)”
fruit_list %>%
map(mutate(fruit_count = map(function(x) strsplit(x$fruits, ";"), length))) %>%
filter(fruit_count==1) %>%
count(solo_fruits = fruits)
我可以在单个 tibble/df 上执行此功能,但不能跨 tibble 列表执行此功能。我是否缺少map()
功能或更明显的东西?谢谢!
第一个小标题的所需结果格式:
# A tibble: 2 x 2
solo_fruits n
<chr> <int>
1 apples 1
2 bananas 1
我如何为单个样本得出上述答案:
day_1_df <- as.data.frame(fruit_list[[1]])
day_1_df %>%
mutate(fruit_count = map(strsplit(day_1_df$fruits, ";"), length)) %>%
filter(fruit_count==1) %>%
count(solo_fruits = fruits)
解决方案
不完全符合您的要求,但它可能会以不同的方式解决您的问题:
library(tidyverse)
day_1 <- as_data_frame(setNames(list(c("oranges;peaches;apples", "pears;apples", "bananas", "oranges;apples", "apples")), "fruits"))
day_2 <- as_data_frame(setNames(list(c("oranges;apples", "peaches","apples;bananas;", "pears", "apples;peaches", "oranges")), "fruits"))
day_3 <- as_data_frame(setNames(list(c("peaches;pears","apples","bananas")), "fruits"))
df <- tibble(day = 1:3, fruits = c(day_1, day_2, day_3)) %>%
unnest() %>%
mutate(fruits = strsplit(fruits, ";"), customer = row_number()) %>%
unnest()
df %>%
group_by(customer) %>%
filter(n() == 1) %>%
group_by(customer, day, fruits) %>%
summarise(n = n())
# # A tibble: 7 x 4
# # Groups: customer, day [?]
# customer day fruits n
# <int> <int> <chr> <int>
# 1 3 1 bananas 1
# 2 5 1 apples 1
# 3 7 2 peaches 1
# 4 9 2 pears 1
# 5 11 2 oranges 1
# 6 13 3 apples 1
# 7 14 3 bananas 1
编辑:误会后更改
推荐阅读
- azure - 使用 Azure 数据工厂从 SFTP 获取 ZIP 文件到 Azure Datalake 并将其存储为 CSV 格式
- sql - MSAccess 更新关于 INNER JOIN 的 INNER JOIN
- linux-kernel - E: 包 'linux-headers-4.15.0-29-generic' 没有安装候选
- mysql - ActiveRecord::ConnectionNotEstablished: 拒绝访问
- modelica - 在 Dymola 中使用“继续”计算时覆盖 mat 文件
- python - 通过添加给定的小时列将日期对象 excel 列转换为日期时间字符串
- android-studio - Flutter:多个材质小部件
- flutter - Flutter - 使用国际翻译对 Cubit/ Bloc 内的消息进行应用本地化
- wolfram-mathematica - 如何从文件中导入数据作为 Mathematica 中的列表
- cordova - Cordova iOS 应用程序在应用程序关闭后擦除 indexedDB 数据