【问题标题】:list of data frames, trying to create new column with normalisation values for each dataframe数据框列表,尝试为每个数据框创建具有标准化值的新列
【发布时间】:2023-01-10 23:45:03
【问题描述】:

我是 的新手,主要与 s 一起工作。一个常见的任务是计算来自多个数据帧的多个参数。我有一个演示数据集:数据集

Season Product Quality Sales
Winter Apple bad 345
Winter Apple good 13
Winter Potato bad 23
Winter Potato good 66
Winter Beer bad 345
Winter Beer good 34
Summer Apple bad 88
Summer Apple good 90
Summer Potato bad 123
Summer Potato good 457
Summer Beer bad 44
Summer Beer good 546

我想做的是为“Sales”添加一列“FC”([tag:fold change])。必须根据“质量”为每个“季节”和“产品”计算 FC。“坏”是底线。

期望的结果:

Season Product Quality Sales FC
Winter Apple bad 345 1.00
Winter Apple good 13 0.04
Winter Potato bad 23 1.00
Winter Potato good 66 2.87
Winter Beer bad 345 1.00
Winter Beer good 34 0.10
Summer Apple bad 88 1.00
Summer Apple good 90 1.02
Summer Potato bad 123 1.00
Summer Potato good 457 3.72
Summer Beer bad 44 1.00
Summer Beer good 546 12.41

一种方法是先通过“季节”,然后通过“产品”(例如创建子集数据框subset_winter_apple) 然后像这样计算 FC:subset_winter_apple$FC = subset_winter_apple$Sales / subset_winter_apple$Sales[1]。稍后,我可以再次组合所有子集数据帧,例如使用绑定用 FC 列重构原始数据框。然而,这是非常低效的。所以我想到了ting 数据框并创建了一个拆分(数据集,列表(数据集$Season,数据集$Product)).

但是,现在我在规范化(FC 计算)上苦苦挣扎,因为我不知道如何引用特定的第一个单元格值中的“销售”数据框列表这样每个列出的数据框中该列中的每个值都被单独标准化。我确实设法计算了列表的 FC 值,但是,它是每个列出的数据框中与第一个使用 的精确副本:

lapply(数据集,函数(DF){DF$FC = 数据集[[1]]$Sales/数据集[[1]]$Sales[1];DF})

显然,我不知道如何引用特定列中的第一个单元格以规范化每个列出的数据框的整个列.有人能帮帮我吗?

非常感谢您的建议。

【问题讨论】:

  • 请使用dput(例如dput(yourdata))发布您的数据,以便我们使用它们并提供解决方案。

标签: r dataframe normalize filter split list lappy r list dataframe lapply normalization


【解决方案1】:

dplyr解决方案

在分组mutate() 中使用逻辑索引:

library(dplyr)

dataset %>%
  group_by(Season, Product) %>%
  mutate(FC = Sales / Sales[Quality == "bad"]) %>%
  ungroup()
# A tibble: 12 × 5
   Season Product Quality Sales      FC
   <chr>  <chr>   <chr>   <int>   <dbl>
 1 Winter Apple   bad       345  1     
 2 Winter Apple   good       13  0.0377
 3 Winter Potato  bad        23  1     
 4 Winter Potato  good       66  2.87  
 5 Winter Beer    bad       345  1     
 6 Winter Beer    good       34  0.0986
 7 Summer Apple   bad        88  1     
 8 Summer Apple   good       90  1.02  
 9 Summer Potato  bad       123  1     
10 Summer Potato  good      457  3.72  
11 Summer Beer    bad        44  1     
12 Summer Beer    good      546 12.4   

基础 R 解决方案

使用by()

dataset <- by(
  dataset,
  list(dataset$Season, dataset$Product),
  (x) transform(x, FC = Sales / Sales[Quality == "bad"])
)

dataset <- do.call(rbind, dataset)

dataset[order(as.numeric(rownames(dataset))), ]
   Season Product Quality Sales          FC
1  Winter   Apple     bad   345  1.00000000
2  Winter   Apple    good    13  0.03768116
3  Winter  Potato     bad    23  1.00000000
4  Winter  Potato    good    66  2.86956522
5  Winter    Beer     bad   345  1.00000000
6  Winter    Beer    good    34  0.09855072
7  Summer   Apple     bad    88  1.00000000
8  Summer   Apple    good    90  1.02272727
9  Summer  Potato     bad   123  1.00000000
10 Summer  Potato    good   457  3.71544715
11 Summer    Beer     bad    44  1.00000000
12 Summer    Beer    good   546 12.40909091

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2015-04-21
    • 2019-03-11
    • 1970-01-01
    • 2022-06-17
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多