多变量比例表

时间:2018-06-22 21:08:36

标签: r dplyr data.table

我正在尝试为按因子和年份分组的连续变量创建相对频率。我的最低代码如下。 factor1具有3个级别,并且年份跨度多年。每个连续变量都是按因子1和年份分组的总和。

factor1<-c(1,2,3,1,2,3)
years<-c(2000,2000,2000,2001,2001,2001)
continuous1<-seq(50,300,50)
continuous2<-seq(50,300,50)
continuous3<-seq(50,300,50)
continuous4<-seq(50,300,50)
df<-cbind(years,factor2,continuous1,continuous2,continuous3,continuous4)

我会有类似这样的输出:

factor1 years continuous1 continuous2 continuous3 continuous4
  1    2000       0.166         0.166    0.166        0.166
  2    2000       0.333         0.333    0.333        0.333
  3    2000       0.5           0.5      0.5          0.5
  1    2001       0.266         0.266    0.266        0.266
  2    2001       0.333         0.333    0.333        0.333
  3    2001       0.4           0.4      0.4          0.4

我们将不胜感激您提供的任何建议或建议!

2 个答案:

答案 0 :(得分:0)

尚不清楚您要完成什么,但这是可以通过data.table使您处于可能状态的方法:

library(data.table)

dt <- as.data.table(df)

> dt[ , lapply( .SD, function(x) sum(x)/.N ), by = .(factor1, factor2) ]
   factor1 factor2 continuous1 continuous2 continuous3 continuous4
1:       1    2000          50          50          50          50
2:       2    2000         100         100         100         100
3:       3    2000         150         150         150         150
4:       1    2001         200         200         200         200
5:       2    2001         250         250         250         250
6:       3    2001         300         300         300         300

看看各个组件的输出以了解正在发生的事情:

dt[ , lapply(.SD, sum), by = .(factor1, factor2) ]
dt[ , .N, by = .(factor1, factor2) ]

根据需要更改公式。如果您想要更具体的答案,请用更好的示例,对要计算的内容的更好描述以及所需输出的示例来更新问题。

答案 1 :(得分:0)

我更喜欢使用dplyr::mutate_at来实现解决方案,因为所有4列的名称都相似。基于dplyr的解决方案将类似于:

library(dplyr)

df %>% group_by(years) %>%
  mutate_at(vars(starts_with("continuous")), funs(./sum(.)))

# # A tibble: 6 x 6
# # Groups: years [2]
#   years factor1 continuous1 continuous2 continuous3 continuous4
#   <dbl>   <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
# 1  2000    1.00       0.167       0.167       0.167       0.167
# 2  2000    2.00       0.333       0.333       0.333       0.333
# 3  2000    3.00       0.500       0.500       0.500       0.500
# 4  2001    1.00       0.267       0.267       0.267       0.267
# 5  2001    2.00       0.333       0.333       0.333       0.333
# 6  2001    3.00       0.400       0.400       0.400       0.400

注意:我已经修改了OP的data.frame创建步骤,并用cbind更改了data.frame

数据:内容与OP使用的内容相同。

factor1<-c(1,2,3,1,2,3)
years<-c(2000,2000,2000,2001,2001,2001)
continuous1<-seq(50,300,50)
continuous2<-seq(50,300,50)
continuous3<-seq(50,300,50)
continuous4<-seq(50,300,50)
#df<-cbind(years,factor1,continuous1,continuous2,continuous3,continuous4)
# Used data.frame to create a data.frame instead of a matrix
df<-data.frame(years,factor1,continuous1,continuous2,continuous3,continuous4)