R 计算每列中组内总数的百分比并进行转换

R 计算每列中组内总数的百分比并进行转换,r,dplyr,R,Dplyr,有没有办法创建以下输出(假设有很多ID和更多属性)? 在计算完ID内的ATT1和ATT2占总数的百分比后,我被卡住了,以此类推。。不知道如何将行变成列标题和聚合 输入文件(R中的df): 我希望输出文件看起来像(ATT4_l被切断): 我试着使用dplyr df %>% group_by(ID, ATT1) %>% mutate(proc = (Value/sum(Value) * 100)) 但我不知道一旦我计算了所有ATT,将它们放入列中并进行聚合,使每个ID只有一行数据后该怎

有没有办法创建以下输出(假设有很多ID和更多属性)? 在计算完ID内的ATT1和ATT2占总数的百分比后,我被卡住了,以此类推。。不知道如何将行变成列标题和聚合

输入文件(R中的df):

我希望输出文件看起来像(ATT4_l被切断):

我试着使用dplyr

df %>% group_by(ID, ATT1) %>% mutate(proc = (Value/sum(Value) * 100))

但我不知道一旦我计算了所有ATT,将它们放入列中并进行聚合,使每个ID只有一行数据后该怎么办。

我相信您正在寻找
重塑2

library(reshape2)

df.new <- dcast(df,
                formula = ID~ATT1,
                value.var = "proc",
                fun.aggregate = mean)
library(重塑2)

df.new您可以使用
tidyverse
的两个主要工作区来完成此操作:
dplyr
用于计算,而
tidyr
用于重塑数据。一些整形是复杂的,所以我把它分成几步

库(dplyr)
图书馆(tidyr)
...
如果您
将数据从原来的宽格式收集成长格式,您将有一列ID、一列ATTx值、一列字母(不知道这些字母的上下文含义,所以我直接称之为
字母
),以及一列值。通过这种格式,您可以通过ID、ATT和字母的组合对观察结果进行分组,然后您可以按照布局的方式将ATT和字母粘在一起

df%>%
聚集(键=att,值=letter,-ID,-value)%>%
总目()
#>#tibble:6 x 4
#>ID值att字母
#>       
#>110附件1 a
#>2 1 10附件1 a
#>3 1 10附件1 a
#>4 1 10附件1 b
#>5 1 10附件1 b
#>6 2 20附件1 a
分组后,计算每个ID/ATT/字母组合的总值:

df%>%
聚集(键=att,值=letter,-ID,-value)%>%
分组人(身份证、收件人、信函)%>%
总结(组值=总和(值))%>%
总目()
#>#tibble:6 x 4
#>#组:ID,att[3]
#>ID att字母组
#>           
#>1附件1 a 30
#>2 1附件1 b 20
#>3 1附件2 x 10
#>4 1附件2 y 40
#>5 1附件3 c 20
#>6 1附件3 d 30
使用
mutate
,您可以计算每个观察值在其较大组中的份额
mutate
删除分组层次结构的一层,因此这是给定ID和ATT中每个字母的值份额。由于您不再需要总值,只需要它们的份额,请删除该列,并将ATT和字母与
unite
粘在一起

df%>%
聚集(键=att,值=letter,-ID,-value)%>%
分组人(身份证、收件人、信函)%>%
总结(组值=总和(值))%>%
突变(共享=组值/和(组值))%>%
选择(-group_val)%>%
联合(集团,收件人,信函,sep=“”)%>%
总目()
#>#tibble:6 x 3
#>#组:ID[1]
#>ID组共享
#>      
#>1附件1_a 0.6
#>2 1附件1_b 0.4
#>3 1附件2×0.2
#>4 1附件2_y 0.8
#>5 1附件3_c 0.4
#>6 1附件3\u d 0.6
现在,您已经获得了所有要查找的信息,只需将其转换为广泛的格式,将
列中的值转换为单独的列。您可以使用
排列

df%>%
聚集(键=att,值=letter,-ID,-value)%>%
分组人(身份证、收件人、信函)%>%
总结(组值=总和(值))%>%
突变(共享=组值/和(组值))%>%
选择(-group_val)%>%
联合(集团,收件人,信函,sep=“”)%>%
价差(键=组,值=份额)
#>#tibble:2 x 11
#>#组:ID[2]
#>ID ATT1_a ATT1_b ATT2_x ATT2_y ATT3_c ATT3_d ATT4_i ATT4_j ATT4_k
#>                     
#> 1     1    0.6    0.4    0.2    0.8    0.4    0.6    0.2    0.2    0.4
#>2 2 1 NA 1 NA 1 NA 1
#> # ... 还有1个变量:ATT4_l
请注意,此处填写了
NA
s,其中没有对ID/ATT/letter组合的观察结果。我假设你会有比你发布的样本更完整的数据


由(v0.2.1)创建于2018-10-03谢谢,我不熟悉Reforme2库,我正在努力解决这一部分:value.names=“att.factor”代码的第二部分%>%group_by(ID,att.factor)%%>%。。正在抛出一个错误,上面写着“分组数据中的错误,未命名(vars),drop):列
att.factor
未知”仅供参考,
restrape2
被弃用,取而代之的是
tidyr
:@Lulumocha,错误可能是
变量。名称和
值。名称不应该在末尾有s。我去掉了拼写错误,现在应该可以了@卡米尔谢谢你,我没有意识到这一点。非常感谢你的详细解释和步骤!我学到了很多新东西,团结、传播等等,还有像在ID和值之前使用-符号之类的东西。
df %>% group_by(ID, ATT1) %>% mutate(proc = (Value/sum(Value) * 100))
library(reshape2)

df.new <- dcast(df,
                formula = ID~ATT1,
                value.var = "proc",
                fun.aggregate = mean)
df.tidy <- melt(df, 
                id.vars = c("ID","Value"),
                variable.name = "ATT1_4",
                value.name = "att.factor")
df.tidy <- df.tidy %>% group_by(ID, att.factor) %>% mutate(proc = (Value/sum(Value)*100))
df.new <- dcast(df.tidy,
                formula = ID~att.factor,
                value.var = "proc",
                fun.aggregate = mean)