关注a previous question I asked, I got an awesome answer。
以下是快速摘要: 我想基于南非数据多年来计算多维开发指数。我的列表由每年的个人信息组成,所以基本上df1大约是第1年,df2大约是第2年。
df1<-data.frame(var1=c(1, 1,1), var2=c(0,0,1), var3=c(1,1,0))
df2<-data.frame(var1=c(1, 0,1), var2=c(1,0,1), var3=c(0,1,0))
mylist <-list (df1,df2)
var1可能是每个人的宗教立场,var2她在上次全国大选中的投票方式等等。在我非常简单的情况下,我每年都有3个不同的人的数据。
从那里,我根据一些变量(不是所有变量)计算索引
你可以在这里找到一个非常简化的工作索引函数,只有3个变量中的2个,名为dimX和dimY:
myindex <- function(x, dimX, dimY){
econ_i<- ( x[dimX]+ x[dimY] )
return ( (1/length(econ_i))*sum(econ_i) )
}
myindex(df1, "var2", "var3")
和
myindex2 = function(x, d) {
myindex(x, d[1], d[2])
}
然后我有我想用于索引的变量数据框。我正在尝试计算几组变量的索引。
args <- data.frame(set1=c("var1", "var2"), set2=c("var2", "var3"), stringsAsFactors = F)
我希望得到如下结果:(a)list(set1 = list(df1, df2), set2 = (df1, df2))
而不是(b)list(df1 = list(set1, set2), df2 = list(set1, set2))
。
情况(a)代表一个时间序列,这意味着我每年只有一组变量的索引结果列表。情况(b)与每组变量的指数结果相反。每个单独的结果应该是唯一的数值。因此,我期望得到2个子列表df1和df2的列表,每个子列表包含3个数值。
我被建议使用那个伟大的命令:
lapply(mylist, function(m) lapply(args, myindex2, x = m))
它工作得很好,但我得到的结果是错误的&#34;格式,即我展示的第二个(b)。 我怎样才能得到每组的结果(即案例(a)作为时间序列)而不是每年?
非常感谢你的帮助!
PJ
编辑:我设法找到了一个无法回答问题的解决方案,但仍允许我按所需顺序获取数据。 也就是说,我将我的列表列表转换为我只是转置的矩阵。
答案 0 :(得分:1)
此答案将被修改!
目前,您的函数index()
执行此操作
myindex <- function(x, dimX, dimY){
econ_i<- ( x[dimX]+ x[dimY] )
return ( (1/length(econ_i))*sum(econ_i) )
}
不是你在这之后吗?
myindex <- function(x, dimX, dimY){
econ_i<- ( x[,dimX]+ x[,dimY] )
return ( (1/length(econ_i))*sum(econ_i) )
}
您现在拥有它的方式,length(econ_i)
始终返回1,因为econ_i
是data.frame()
而不是向量。 data.frame()
的长度始终为1,而向量的长度为其中的元素数。
请注意,这是R中输出的内容。
df1["var1"]
var1
1 1
2 1
3 1
返回data.frame()
df1[,"var1"]
[1] 1 1 1
返回一个向量。
当您回复时,我会调整此帖子以回答您的问题。我认为首先解决这个问题非常重要。
答案 1 :(得分:1)
如果可以提供任何帮助,from this article,这里是我的实际索引函数:
RCI_a_3det <-function(x, econ1, econ2, econ3, perso1, perso2, perso3, civic1, civic2, civic3){
econ_i<- (1/3) *( x[econ1]+ x[econ2] + x[econ3])
perso_i<- (1/3)*( x[perso1] + x[perso2] + x[perso3])
civic_i<- (1/3)*(x[civic1] + x[civic2] + x[civic3])
daf <- data.frame(econ_i, perso_i, civic_i)
colnames(daf)<- c("econ_i", "perso_i", "civic_i")
df1 <- subset(daf, daf$econ_i !=1 & daf$perso_i !=1 & daf$civic_i!=1 )
sum_xik <- (df1$econ_i + df1$perso_i + df1$civic_i)
return ( 1/(3*nrow(df1)) * sum(sum_xik, na.rm=T))
}
编辑: x是每个变量和每年的所有个人信息的列表。它非常大。 我使用9个变量来计算这个索引,但实际上我的数据中有30个这样的变量,所以我设置了一组数据框,用来计算这个索引。这相当于我在简单示例中的args df。我实际上使用了200个这样的组合。