我正在尝试为按因子和年份分组的连续变量创建相对频率。我的最低代码如下。 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
我们将不胜感激您提供的任何建议或建议!
答案 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)