【问题标题】:How to get in a specific order the results of an r lapply function with arguments from a dataframe如何以特定顺序获取带有数据帧参数的 r lapply 函数的结果
【发布时间】:2018-06-06 14:52:46
【问题描述】:

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

效果很好,但我得到的结果格式“错误”,即我展示的第二个 (b)。 我怎样才能得到按集合排序的结果(即案例 (a) 作为时间序列)而不是每年?

非常感谢您的帮助!

PJ

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

【问题讨论】:

  • 一些注释:您在最后一行中所做的时间序列注释是模糊的。还请提供更详细的视觉效果来描述您想要的内容。你需要通过视觉来明确你的目标。例如:什么是“错误”格式,什么是“正确”格式?让读者尽可能容易理解你在说什么。
  • 感谢您的回答。我编辑了我的帖子以使其尽可能清晰。如果我做错了,请随时告诉我。
  • 在我或其他人回答您的问题之前,我有一个问题要问。如下所述。

标签: r loops dataframe lapply


【解决方案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

返回一个向量。

当您回复时,我会调整此帖子以回答您的问题。我认为首先解决这部分很重要。

【讨论】:

  • 非常感谢您的回答!实际上,这是一个非常好的观点。我在示例中犯了一个错误,但幸运的是它并没有真正影响我的结果,因为在我的实际索引中,我使用的是 nrow() 而不是 length()。我已经将 x[dimX] 和 x[,dimX] 与我的数据一起使用,并且得到了相同的结果。因此,我想说的是,即使您指出的内容本身非常准确,但它与我的实际问题并不真正相关。
  • 索引代表什么?我不确定它在计算什么。
  • 我用我的实际索引函数来回答,让你看看它是什么:)
  • 我发布了我的实际索引函数。如果我可以提供更多信息,请告诉我,当然!非常感谢您的帮助。
【解决方案2】:

如果这可以提供任何帮助,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 种这样的组合。

【讨论】:

  • 在法国,我要去睡觉了。明天我会回答更多。再次感谢!
  • 谢谢,很高兴知道一些上下文。这只是我的好奇心达到顶峰。
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2021-09-11
  • 2020-02-18
  • 2018-01-22
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多