繁体   English   中英

数据框列表,尝试为每个 dataframe 创建具有归一化值的新列

[英]list of data frames, trying to create new column with normalisation values for each dataframe

我是的新手,主要使用 s。 一项常见的任务是对来自多个数据帧的多个参数的计数进行 我有一个演示数据集:数据集

季节 产品 质量 销售量
冬天 苹果 坏的 345
冬天 苹果 好的 13
冬天 土豆 坏的 23
冬天 土豆 好的 66
冬天 啤酒 坏的 345
冬天 啤酒 好的 34
夏天 苹果 坏的 88
夏天 苹果 好的 90后
夏天 土豆 坏的 123
夏天 土豆 好的 457
夏天 啤酒 坏的 44
夏天 啤酒 好的 546

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

期望的结果:

季节 产品 质量 销售量 FC
冬天 苹果 坏的 345 1.00
冬天 苹果 好的 13 0.04
冬天 土豆 坏的 23 1.00
冬天 土豆 好的 66 2.87
冬天 啤酒 坏的 345 1.00
冬天 啤酒 好的 34 0.10
夏天 苹果 坏的 88 1.00
夏天 苹果 好的 90后 1.02
夏天 土豆 坏的 123 1.00
夏天 土豆 好的 457 3.72
夏天 啤酒 坏的 44 1.00
夏天 啤酒 好的 546 12.41

一种方法是先按“季节” ,然后按“产品”过滤(例如创建子集数据框subset_winter_apple ),然后计算 FC 类似于:subset_winter_apple$FC = subset_winter_apple$Sales / subset_winter_apple$Sales[1]。 稍后,我可以再次组合所有子集数据帧,例如使用rbind重建带有 FC 列的原始数据帧。 然而,这是非常低效的。 所以我想到数据框并创建一个split(dataset, list(dataset$Season, dataset$Product))

但是,现在我在规范化(FC 计算)方面苦苦挣扎,因为我不知道如何在数据框列表中引用“Sales”的特定第一个单元格值,以便每个列出的数据框中该列中的每个值都被单独规范化. 我确实设法计算了列表的 FC 值,但是,它是每个列出的数据框中的精确副本,来自第一个使用的数据框:

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

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

非常感谢您的建议。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM