如何使用数据帧中的参数以特定顺序获取r lapply函数的结果

时间:2017-12-25 08:53:53

标签: r loops dataframe lapply

关注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

编辑:我设法找到了一个无法回答问题的解决方案,但仍允许我按所需顺序获取数据。 也就是说,我将我的列表列表转换为我只是转置的矩阵。

2 个答案:

答案 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_idata.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个这样的组合。