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

Fre*_*red 1 r data-manipulation collapse data-management dataframe

限定

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

ST

> 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
Run Code Online (Sandbox Code Playgroud)

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

> df$V1 <- as.character(df$V1)
> df$V4 <- as.character(df$V4)  
Run Code Online (Sandbox Code Playgroud)

我希望通过V1保持"折叠"数据框:

  • V2的最大值
  • V3的平均值
  • V4的模式(这个值实际上不会在V1组中发生变化,因此,第一个,最后一个等也可能会发生变化.)

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

在这种情况下,我想要输出表单:

> df.collapse
   V1 V2 V3 V4
1 egg  2 25  a
2 jap  3 55  b
Run Code Online (Sandbox Code Playgroud)

koh*_*ske 8

plyr包将帮助您:

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

由于R没有模式功能(可能),我把其他功能.但是实现模式功能很容易.


dil*_*iop 5

我会建议使用ddply来自plyr:

require(plyr)
ddply(df, .(V1), summarise, V2=max(V2), V3=mean(V3), V4=V4[1])
Run Code Online (Sandbox Code Playgroud)

您可以使用任何所需的计算替换这些函数.您的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]))
})
Run Code Online (Sandbox Code Playgroud)