繁体   English   中英

在每个变量上使用不同的函数逐组折叠数据

[英]Collapse data frame by group using different functions on each variable

定义

df<-read.table(textConnection('egg 1 20 a
                        egg 2 30 a
                        jap 3 50 b
                        jap 1 60 b'))

英石

> df
   V1 V2 V3 V4
1 egg  1 20  a
2 egg  2 30  a
3 jap  3 50  b
4 jap  1 60  b

我的数据没有因子,所以我将因子转换为字符:

> df$V1 <- as.character(df$V1)
> df$V4 <- as.character(df$V4)  

我想通过 V1 保持“折叠”数据框:

  • V2的最大值
  • V3 的平均值
  • V4 的模式(这个值在 V1 组中实际上并没有改变,所以 first、last 等也可能会改变。)

请注意,这是一个普遍的问题,例如我的数据集要大得多,我可能希望在折叠时使用不同的函数(例如,last、first、min、max、variance、st.dev. 等用于不同的变量)。 因此,functions 参数可能会很长。

在这种情况下,我想要 output 的形式:

> df.collapse
   V1 V2 V3 V4
1 egg  2 25  a
2 jap  3 55  b

plyr package 将帮助您:

library(plyr)
ddply(df, .(V1), summarize, V2 = max(V2), V3 = mean(V3), V4 = toupper(V4)[1])

由于 R 没有模式 function(可能),我把其他 function。 但是很容易实现一个模式 function。

我建议使用ddplyplyr

require(plyr)
ddply(df, .(V1), summarise, V2=max(V2), V3=mean(V3), V4=V4[1])

您可以用您希望的任何计算替换这些函数。 您的 V3 列是非数字的,因此可能需要将其转换为数字,然后计算模式。 现在我只是为每个拆分返回第一行的 V3 值。 或者,如果您不想使用plyr

do.call(rbind, lapply(split(df, df$V1), function(x) {
    data.frame(V2=max(x$V2), V3=mean(x$V3), V4=x$V4[1]))
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM