我正在使用包含反人口贩运组织信息的数据集。组织由组织名称或组织主页的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值。
任何人都可以建议系统地为大型数据集执行此操作吗?在此先感谢您的帮助!
答案 0 :(得分:6)
一种选择是使用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
答案 1 :(得分:3)
我认为你应该选择Andrie's,因为他给你的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
答案 2 :(得分:2)
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)))
答案 3 :(得分:2)
由于y
和z
代表行数,因此本身就是正数,因此您可以使用这种简单的方法:
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