R - 计算列中的观察值字符串并计算为总体观察值的百分比

如何解决R - 计算列中的观察值字符串并计算为总体观察值的百分比

嗨,有一些看起来像这样的数据:

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

  1. 计算Item列中观察值的百分比(例如该列有10个项目,其中4个是Eggs,因此Eggs的百分比为40)立>
  2. 计算每个Value组的平均Item

理想情况下,最终数据应如下所示:

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,因为我看不出我还能怎么做?

解决方法

您可以使用 mergeproportions 的结果形式 tableaggregate meanValue ~ Item 的结果。如果还需要 Date,可以使用 cbinddata.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,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 
,

tidyverse

中执行这些步骤
  • 将工作目录设置为存储 300 多个 csv 文件的目录
  • 将所有 300 多个 csv 名称读入 temp
  • 假设每个 csv 名称都指向您的 date 否则您必须稍微调整代码
  • 使用 mapimap_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))

如果您所有的 csv 都包含日期列,请执行此操作

map_dfr(temp,~read.csv(.x) %>% group_by(item,date) %>%
          summarise(Percentage = n()/nrow(df)*100,.groups = 'drop'))
,

使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?