R - 计算列中的观察值(字符串)并计算为总体观察值的百分比
R - Count observations (strings) in a column and calculate as a percentage of overall observations
嗨,有一些数据看起来像这样:
ID Item Class Value Date
1 Eggs A 5 07/07/21
2 Eggs A 4.5 07/07/21
3 Cereal C 2 07/07/21
4 Eggs B 3.5 07/07/21
5 Bread B 2.5 07/07/21
6 Juice A 3 07/07/21
7 Juice C 1.5 07/07/21
8 Eggs C 2 07/07/21
9 Bread A 3 07/07/21
10 Juice A 3 07/07/21
这只是一个示例,实际数据大约有 8k 行(并且有 300 多个数据帧)。我想创建一个新的 df
- 计算
Item
列中观察值的百分比(例如列中有10个项目,其中4个是Eggs
,因此Eggs
的百分比是40)
- 计算每个
Item
组的平均值 Value
理想情况下,最终数据应如下所示:
Item Percentage Average_Value Date
Eggs 40 3.75 07/07/21
Cereal 10 2 07/07/21
Bread 20 2.75 07/07/21
Juice 30 2.5 07/07/21
有几点需要注意 - 我想对 300 多个不同的 csv(存储我的数据的地方)执行此操作,并使用这些新信息创建一个 df。每个 csv 引用不同的日期,因此最终的 df 看起来像上面的内容,只有另外四行,但具有不同的值和不同的日期。我知道我需要为此使用 for 循环,也许我应该稍后弄清楚那部分,但我认为现在值得一提。最后,在某些时候,我可能还想计算 Class
的平均值。我是否可以为此制作一个单独的 df 更好,因为我不知道我还能怎么做?
您可以 merge
table
的 proportions
的结果与 Value ~ Item
的 mean
的结果形式 aggregate
。如果 Date
也需要在那里,可以使用 cbind
或 data.frame
.
添加
merge(aggregate(cbind(Average_Value = Value) ~ Item, x, mean)
, proportions(table(x$Item))*100
, by.y=1, by.x="Item")[c(1,3,2)]
# Item Freq Average_Value
#1 Bread 20 2.75
#2 Cereal 10 2.00
#3 Eggs 40 3.75
#4 Juice 30 2.50
或仅使用 aggregate
:
aggregate(Value ~ Item, x, function(y) c(Freq=length(y)/nrow(x)*100, Average=mean(y)))
# Item Value.Freq Value.Average
#1 Bread 20.00 2.75
#2 Cereal 10.00 2.00
#3 Eggs 40.00 3.75
#4 Juice 30.00 2.50
这个有用吗:
library(dplyr)
df %>% group_by(Item) %>% summarise(Percentage = n()/nrow(df)*100, Average_Value = mean(Value))
# A tibble: 4 x 3
Item Percentage Average_Value
<chr> <dbl> <dbl>
1 Bread 20 2.75
2 Cereal 10 2
3 Eggs 40 3.75
4 Juice 30 2.5
使用 list.files
列出您要使用的所有文件。使用 map_df
将它们组合在一个文件中,并为每个 Date
计算 Item
存在的百分比及其平均值。
library(tidyverse)
filenames <- list.files(pattern = '\.csv$')
map_df(filenames, read_csv) %>%
group_by(Date, Item) %>%
summarise(Percentage = n(),
Average_Value = mean(Value)) %>%
mutate(Percentage = prop.table(Percentage) * 100) %>%
ungroup -> result
result
在 tidyverse
中执行这些步骤
- 将工作目录设置为存储 300 多个 csv 文件的目录
- 将所有 300 多个 csv 名称读入
temp
- 假设每个 csv 名称都引用您的
date
否则您必须稍微调整一下代码
- 使用
map
和 imap_dfr
如下所述,您可以对每个文件只执行一次相同的代码,因此您将拥有一个数据帧
setwd('my/path/here')
temp <- list.files(pattern = '*.csv')
library(tidyverse)
map(temp, read.csv) %>% setNames(gsub('.csv', '', temp)) %>%
imap_dfr(~ .x %>% group_by(item) %>%
summarise(Percentage = n()/nrow(df)*100,
Average_Value = mean(Value), .groups = 'drop') %>%
mutate(Date = .y))
如果您的所有 csvs 都包含日期列,请执行此操作
map_dfr(temp, ~read.csv(.x) %>% group_by(item, date) %>%
summarise(Percentage = n()/nrow(df)*100,
Average_Value = mean(Value), .groups = 'drop'))
嗨,有一些数据看起来像这样:
ID Item Class Value Date
1 Eggs A 5 07/07/21
2 Eggs A 4.5 07/07/21
3 Cereal C 2 07/07/21
4 Eggs B 3.5 07/07/21
5 Bread B 2.5 07/07/21
6 Juice A 3 07/07/21
7 Juice C 1.5 07/07/21
8 Eggs C 2 07/07/21
9 Bread A 3 07/07/21
10 Juice A 3 07/07/21
这只是一个示例,实际数据大约有 8k 行(并且有 300 多个数据帧)。我想创建一个新的 df
- 计算
Item
列中观察值的百分比(例如列中有10个项目,其中4个是Eggs
,因此Eggs
的百分比是40) - 计算每个
Item
组的平均值Value
理想情况下,最终数据应如下所示:
Item Percentage Average_Value Date
Eggs 40 3.75 07/07/21
Cereal 10 2 07/07/21
Bread 20 2.75 07/07/21
Juice 30 2.5 07/07/21
有几点需要注意 - 我想对 300 多个不同的 csv(存储我的数据的地方)执行此操作,并使用这些新信息创建一个 df。每个 csv 引用不同的日期,因此最终的 df 看起来像上面的内容,只有另外四行,但具有不同的值和不同的日期。我知道我需要为此使用 for 循环,也许我应该稍后弄清楚那部分,但我认为现在值得一提。最后,在某些时候,我可能还想计算 Class
的平均值。我是否可以为此制作一个单独的 df 更好,因为我不知道我还能怎么做?
您可以 merge
table
的 proportions
的结果与 Value ~ Item
的 mean
的结果形式 aggregate
。如果 Date
也需要在那里,可以使用 cbind
或 data.frame
.
merge(aggregate(cbind(Average_Value = Value) ~ Item, x, mean)
, proportions(table(x$Item))*100
, by.y=1, by.x="Item")[c(1,3,2)]
# Item Freq Average_Value
#1 Bread 20 2.75
#2 Cereal 10 2.00
#3 Eggs 40 3.75
#4 Juice 30 2.50
或仅使用 aggregate
:
aggregate(Value ~ Item, x, function(y) c(Freq=length(y)/nrow(x)*100, Average=mean(y)))
# Item Value.Freq Value.Average
#1 Bread 20.00 2.75
#2 Cereal 10.00 2.00
#3 Eggs 40.00 3.75
#4 Juice 30.00 2.50
这个有用吗:
library(dplyr)
df %>% group_by(Item) %>% summarise(Percentage = n()/nrow(df)*100, Average_Value = mean(Value))
# A tibble: 4 x 3
Item Percentage Average_Value
<chr> <dbl> <dbl>
1 Bread 20 2.75
2 Cereal 10 2
3 Eggs 40 3.75
4 Juice 30 2.5
使用 list.files
列出您要使用的所有文件。使用 map_df
将它们组合在一个文件中,并为每个 Date
计算 Item
存在的百分比及其平均值。
library(tidyverse)
filenames <- list.files(pattern = '\.csv$')
map_df(filenames, read_csv) %>%
group_by(Date, Item) %>%
summarise(Percentage = n(),
Average_Value = mean(Value)) %>%
mutate(Percentage = prop.table(Percentage) * 100) %>%
ungroup -> result
result
在 tidyverse
- 将工作目录设置为存储 300 多个 csv 文件的目录
- 将所有 300 多个 csv 名称读入
temp
- 假设每个 csv 名称都引用您的
date
否则您必须稍微调整一下代码 - 使用
map
和imap_dfr
如下所述,您可以对每个文件只执行一次相同的代码,因此您将拥有一个数据帧
setwd('my/path/here')
temp <- list.files(pattern = '*.csv')
library(tidyverse)
map(temp, read.csv) %>% setNames(gsub('.csv', '', temp)) %>%
imap_dfr(~ .x %>% group_by(item) %>%
summarise(Percentage = n()/nrow(df)*100,
Average_Value = mean(Value), .groups = 'drop') %>%
mutate(Date = .y))
如果您的所有 csvs 都包含日期列,请执行此操作
map_dfr(temp, ~read.csv(.x) %>% group_by(item, date) %>%
summarise(Percentage = n()/nrow(df)*100,
Average_Value = mean(Value), .groups = 'drop'))