按组子集数据

时间:2014-07-23 06:21:52

标签: r dataframe subset

我有一个如下所示的数据框:

df
grp  V2  V3  V4  V5  V6
1   u.3 187 189 141 143 
1   u.3 190 192 144 146             
3   u.3 211 213 165 167             
4   u.3 223 225 177 179         
4   u.3 226 228 180 182     

我想根据grp列对这些数据进行分组。如果重复grp(它可以重复几次),例如在前两行中,那么输出应如下所示:

grp      V2   V3   V4
  1     u.3  187  192

注意输出具有来自第一次grp 1发生的x $ V3 [1]的值以及最后一次出现的V4值(x $ V4 [2]是192)。

df的输出应如下所示:

df.out
grp  V2  V3  V4
1   u.3 187 192                 
3   u.3 211 213             
4   u.3 223 228             

3 个答案:

答案 0 :(得分:2)

这是问题的dplyr解决方案。如果没有安装软件包,请安装软件包dplyr。

library(dplyr)
dat.out <- dat.in %>% group_by(grp) %>%
              summarize(V2 = unique(V2),V3 = min(V3),V4 = max(V4))

答案 1 :(得分:0)

此解决方案基于函数和应用循环 - 并且还应该完成这项工作。 编辑:误解了你提取值的标准,忽略了V3和V4的第一个和最后一个值。

ValExt <- function(g) {
   #Extract first V3 value of the group
   fstV3 <- head(df[which(df$grp==g),"V3"],1)

   #Extract last V4 value of the group
   lstV4 <- tail(df[which(df$grp==g),"V4"],1)

   #Return a row with the group and values
   return(c(g,
            head(df[which(df$grp==g),"V2"],1),
            fstV3,
            lstV4)
            )
}

df.out <- sapply(unique(df$grp),ValExt)

答案 2 :(得分:0)

您也可以使用data.table

 library(data.table)
 setDT(df)[ ,list(V2=unique(V2), V3=min(V3), V4=max(V4)), by=grp]
#    grp  V2  V3  V4
# 1:   1 u.3 187 192
# 2:   3 u.3 211 213
# 3:   4 u.3 223 228