【问题标题】:Collapsing data case by case in R在R中逐个折叠数据
【发布时间】:2012-12-18 13:18:06
【问题描述】:

我正在处理一个包含反人口贩运组织信息的数据集。组织由组织名称或组织主页的 Web 地址标识。我想根据具体情况有条件地折叠此数据框,以便留下一组唯一的标识符(对于我的数据,组织名称或组织的网址)对于每个案例,以及这些案例的大约 1000 多个数字属性,这些数字属性是在崩溃之前标识符关联的行的最高或最低值。为了说明这一点,我想转:

> df1
x      y     z
Item1  0     3
Item1  1     4
Item2  1     2
Item3  1     3
Item2  1     5
Item3  1     2
Item4  0     2

进入类似的东西

> df2
x     y      z
Item1  1     3
Item2  1     2
Item3  1     2
Item4  0     2

当然,在这个例子中,我想保留 Var2 的最大值和 Var3 的最小值,并且只保留唯一的 Var1 值。

任何人都可以建议一种系统的方法来为大型数据集执行此操作吗?提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe collapse


    【解决方案1】:

    一种选择是使用plyr 包:

    library(plyr)
    ddply(df, .(x), summarize, y=max(y), z=min(z))
          x y z
    1 Item1 1 3
    2 Item2 1 2
    3 Item3 1 2
    4 Item4 0 2
    

    另外,同样简单的是包data.table。如果您的数据非常大,此选项可能会大大加快速度。

    library(data.table)
    data.table(df)[, list(y=max(y), z=min(z)), by=x]
           x y z
    1: Item1 1 3
    2: Item2 1 2
    3: Item3 1 2
    4: Item4 0 2
    

    【讨论】:

    • 这很有帮助!但是我有一个(可能是愚蠢的)问题——因为 R 倾向于“思考”向量,所以 data.table 技术在保存我的数据的案例或行方面有多可靠。让我知道这是否需要澄清。
    【解决方案2】:

    我认为您可能应该选择 Andrie 的,因为他为您提供了 data.table 方法,这种方法可以说更简洁,当然也更快,但是在类别内处理不同结果的“经典”方法是使用 lapply(split(...))

    > do.call(rbind, lapply( split(df1, df1$x) , function (d) data.frame(x=d$x[1], 
                                                              mx.y=max(d$y), mn.z=min(d$z)
                 ) ) )
    
              x mx.y mn.z
    Item1 Item1    1    3
    Item2 Item2    1    2
    Item3 Item3    1    2
    Item4 Item4    0    2
    

    【讨论】:

      【解决方案3】:
      library(plyr)
      V1 <- sample(10, 100, replace=TRUE)
      V2 <- sample(100, 100, replace=TRUE)
      V3 <- sample(100, 100, replace=TRUE)
      
      df <- data.frame(V1=V1, V2=V2, V3=V3)
      
      ddply(df, "V1", function(x) c(max(x$V2), min(x$V3)))
      

      【讨论】:

        【解决方案4】:

        由于yz 表示行数,因此本质上是正数,您可以使用这种简单的方法:

        aggregate(cbind(y, -z) ~ x, df1, function(x) abs(max(x)))
        
              x y -z
        1 Item1 1  3
        2 Item2 1  2
        3 Item3 1  2
        4 Item4 0  2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 2018-12-07
          • 2011-09-24
          • 2012-10-04
          • 2013-08-30
          • 1970-01-01
          相关资源
          最近更新 更多