在R中逐个折叠数据

w9apscun  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(148)

我正在处理包含反人口贩运组织信息的数据集。这些组织通过组织名称或组织主页的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

当然,在本例中,我希望保留Var 2的max值和Var 3的min值,并且只保留唯一的Var 1值。
有谁能提出一个系统的方法来处理大型数据集吗?提前感谢您的帮助!

gg0vcinb

gg0vcinb1#

一个选项是使用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
w7t8yxp5

w7t8yxp52#

我认为您可能应该选择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
mwg9r5ms

mwg9r5ms3#

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)))
xv8emn3q

xv8emn3q4#

由于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

相关问题