【问题标题】:Intradataframe Analysis--creating a derivative data frame from another data frameIntradataframe Analysis - 从另一个数据帧创建派生数据帧
【发布时间】:2014-12-19 11:54:02
【问题描述】:

这可能有点晦涩难懂,因为我仍在学习 R,但我正在做一些数据框操作以提取有关分类组的某些百分比,这些百分比是由一个列捕获的,这是一个因素针对我希望从中获得百分比的另一列。我将使用内置的 mtcars 来演示我想要实现的目标,其中 gear 扮演分类变量的角色,而 cyl 是我试图从中获取百分比的数据。

只是一些背景细节来解决问题:

gear 列跨越 3 个不同的值,3,4,5cyl 列也包含 3 个不同的值,4,6,8

我列表的第一个元素说明了最多有 4 个气缸的齿轮类型的百分比。对于 3 档车型,总共 15 款 3 档车型中只有一款丰田 Corona,因此百分比应为 1/15 = 0.0667。对于 4 齿轮模型,总共 12 个 4 齿轮模型中有 8 个,得出 8/12 = 0.667。

现在这是我编写的用于进行此计算的方法。但是输出的结构不是我想要的。相反,我想要将这一切合并到一个数据框中,第一列是不同的 cyl 值,其他列是齿轮类型的 3、4 和 5,其中行是各种百分比。我非常接近,但需要一些帮助来对我目前正在实现的列表进行数据重塑,或者甚至可以使用替代应用功能来实现我正在追求的百分比表,或者任何其他人可以做的魔法。

>  lapply( unique( sort( y$cyl ) ) , function(c) { tapply( y$cyl , y$gear , function(x) sum( x <= c ) / length(x) ) } ) 
[[1]]
         3          4          5 
0.06666667 0.66666667 0.40000000 

[[2]]
  3   4   5 
0.2 1.0 0.6 

[[3]]
3 4 5 
1 1 1 

这就是我希望显示的数据框

  cyl         X3        X4  X5
1   4 0.06666667 0.6666667 0.4
2   6 0.20000000 1.0000000 0.6
3   8 1.00000000 1.0000000 1.0

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    在谷歌搜索“将数组列表转换为 data.frame”后,我想出了一个解决方案,这立即将我引向了以下 SO post

    p <- lapply( unique( sort( mtcars$cyl ) ) , function(c) { tapply( mtcars$cyl , mtcars$gear , function(x) sum( x <= c ) / length(x) ) } )
    
    > df <- data.frame( matrix( unlist(p) , nrow = length(p) , byrow=T ) )
    > df
              X1        X2  X3
    1 0.06666667 0.6666667 0.4
    2 0.20000000 1.0000000 0.6
    3 1.00000000 1.0000000 1.0
    

    除了删除分类名称作为列标题之外,该解决方案还有效,但看起来通过后续分配也可以恢复...

    > colnames(df) <- names(p[[1]])
    > rownames(df) <- unique( sort( mtcars$cyl ) )
    > df
               3         4   5
    4 0.06666667 0.6666667 0.4
    6 0.20000000 1.0000000 0.6
    8 1.00000000 1.0000000 1.0
    

    实际上,链接问题的其他答案很好地解决了列标题问题,行标题问题仍然存在,因为这些值在我的匿名函数调用中丢失了。

    【讨论】:

      猜你喜欢
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多