【发布时间】:2021-02-08 17:52:19
【问题描述】:
假设以下数据框(实际上我的数据框有数千行):
year<-c(2010,2010,2010,2011,2011,2011,2012,2012,2013,2013)
a1<-rnorm(10)
a2<-rnorm(10)
b1<-rnorm(10)
b2<-rnorm(10)
c1<-rnorm(10)
c2<-rnorm(10)
我使用以下代码创建了一个由多个数据框组成的列表,它将原始数据框按年份拆分为子集。
#split datasets into years
df.list<-split(df, df$year)
#Name of datasets df plus year
dfnames <- str_c("df", names(df.list))
names(df.list)<-dfnames
我想对列表的所有数据框应用以下循环:
#df_target is a new data frame that stores the results and j is the indicator for it:
df_target <- NULL
j <- 1
for(i in seq(2, 7, 2)) {
df_target[[j]] <- (df[i]*df[i+1])/(sum(df[i+1]))
j <- j+1
}
}
代码适用于一个数据框,但是,我想将数据框拆分为按年份分组的多个数据框,然后遍历列。
因此,我使用以下函数将上述循环应用于列表中的所有数据帧:
df_target <- NULL
j <- 1
fnc <- function(x){
for(i in seq(2, 7, 2)) {
df_target[[j]] <- (x[i]*x[i+1])/(sum(x[i+1]))
j <- j+1
}
}
sapply(df.list, fnc)
使用此代码,我没有收到任何错误消息,但是列表中的两个数据帧都是 NULL。 我到底做错了什么?
df_target 应该是包含列 a_new= (a1a2)/sum(a2)、b_new= (b1b2)/sum(b2) 和 c_new= (c1*c2)/ 的数据框sum(c2) 但每年单独计算。
【问题讨论】:
-
df只有 7 列,但您的i索引尝试选择不存在的第 8 列和第 10m 列,因此我无法运行您的代码。另外,你能解释一下你想要达到的目标吗?你想让df_target成为...? -
@RicardoSemiãoeCastro 抱歉,我已经编辑了我的问题。它现在应该可以工作了。
-
将数据拆分成多个小的data.frames很少是一个好策略,最好对数据进行reshape,然后使用
dplyr::group_by和dplyr::mutate -
@RichardTelford 然后我可以使用循环吗?我不想按名称或索引选择列,因为有时我有 90 列的数据集。因此,我正在使用循环,并希望将循环应用于数据帧列表。