[英]Split dataframe into several data frames within a list, each column separately
[英]list of data frames, trying to create new column with normalisation values for each dataframe
我是r的新手,主要使用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 值,但是,它是每个列出的数据框中的精确副本,来自第一个使用lappy的数据框:
lapply(数据集,函数(DF){DF$FC = 数据集[[1]]$Sales/数据集[[1]]$Sales[1];DF})
显然,我不知道如何引用特定列中的第一个单元格来规范化每个列出的数据框的整个列。 有人能帮帮我吗?
非常感谢您的建议。
在分组的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
使用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.