如何在R的DataFrame中处理列表列并均分各公司利润?
解决方案:在R中拆分公司列并均分利润
我来帮你解决这个问题!你遇到的核心问题是当生产公司列包含多个公司的集合(字符串形式或列表形式)时,直接unlist会丢失利润与公司的对应关系,无法完成均分。下面分两种常见场景给出具体实现:
场景1:生产公司列是字符串形式(如c(B,C))
如果你的数据集里生产公司是类似c(B,C)的字符串,我们需要先提取出公司名称,再计算均分利润:
步骤1:构造示例数据
library(tidyverse) # 模拟你的原始数据集 df <- tibble( 生产公司 = c("A", "c(B,C)", "D", "c(E,F,G)"), 利润 = c(35000, 15000, 750000, 100000) )
步骤2:处理数据并得到结果
df_processed <- df %>% # 1. 清洗公司字符串:去掉c(和),按逗号分割成公司列表 mutate( 公司列表 = str_remove_all(生产公司, "c\\(|\\)") %>% str_split(",\\s?"), # 2. 计算每个组的公司数量 公司数量 = map_int(公司列表, length), # 3. 计算单个公司的利润,取整匹配你的预期输出 单个利润 = round(利润 / 公司数量, 0) ) %>% # 4. 将公司列表展开为单独的行 unnest(公司列表) %>% # 5. 重命名列并保留需要的字段 select(生产公司 = 公司列表, 利润 = 单个利润) # 查看结果 print(df_processed)
运行后会得到你想要的输出:
# A tibble: 7 × 2 生产公司 利润 <chr> <dbl> 1 A 35000 2 B 7500 3 C 7500 4 D 750000 5 E 33333 6 F 33333 7 G 33333
场景2:生产公司列是真正的列表类型
如果你的生产公司列是R的列表(每个元素是包含多个公司的向量),处理起来更简单,不需要字符串清洗:
步骤1:构造示例列表型数据集
df_list <- tibble( 生产公司 = list("A", c("B","C"), "D", c("E","F","G")), 利润 = c(35000, 15000, 750000, 100000) )
步骤2:处理数据
df_list_processed <- df_list %>% mutate( # 计算每个列表元素的公司数量 公司数量 = map_int(生产公司, length), # 均分利润并取整 单个利润 = round(利润 / 公司数量, 0) ) %>% # 展开列表为单独行 unnest(生产公司) %>% select(生产公司, 利润 = 单个利润)
这样同样能得到预期的拆分和均分结果。
关键说明
- 我们用
map_int来计算每个组的公司数量,保证利润能和对应的公司组匹配; unnest函数负责将列表/向量展开为多行,同时保留对应的均分后利润;- 用
round(0)取整是为了匹配你给出的预期输出,如果需要保留小数可以调整参数。
内容的提问来源于stack exchange,提问作者Anushree Mahajan
相关产品推荐
相关产品推荐

