时间:2016-08-25 01:10:39

标签: r dataframe subset

我想基于两列ColA和ColB(下面)创建一个大数据框的子集。对于ColA中的每个变量(例如A,B,C ......),我想提取与ColB中第一个变量的每次出现相对应的行。因此DF1:

ColA  ColB  ColC
A     Red     7thing
A     Red     OneBot
A     Blue    BotOne
B     Green   Thing7
B     Green   Twosies
B     Green   Square
B     Yellow  Circle
B     Yellow  Polygon
B     Purple  Triangle
B     White   Octagon
C     Orange  Cube
C     Black   Line

将成为DF2:

ColA  ColB  ColC
A     Red     7thing
A     Red     OneBot
B     Green   Thing7
B     Green   Twosies
B     Green   Square
C     Orange  Cube

我并不关心ColC中的重复项,并且ColB中变量的出现次数没有模式。我发现的相关子集策略侧重于提取独特的案例,但我既没有遇到也没有能够设计允许选择第一个变量类型的所有事件的方法,并且会感激一些帮助。

我试过了

DF2 <- DF1[match(unique(DF1$ColB), DF1$ColB),]

...以及在知道变量内容时以变量为目标的子集(例如Subset first n occurrences of certain value in dataframe in R),这些看似不合适。

4 个答案:

答案 0 :(得分:5)

基础R中ave的强大功能,用于将所有ColB个案例与每个群组中的第一个ColB进行比较:

dat[with(dat, ColB == ave(ColB, ColA, FUN=function(x) head(x,1) )),]

#   ColA   ColB    ColC
#1     A    Red  7thing
#2     A    Red  OneBot
#4     B  Green  Thing7
#5     B  Green Twosies
#6     B  Green  Square
#11    C Orange    Cube

使用原始逻辑,您还可以merge仅备份ColA/ColB的非重复记录:

merge(dat, dat[c("ColA","ColB")][!duplicated(dat$ColA),])

答案 1 :(得分:3)

使用aggregate

的另一种方法
df[df$ColB %in% unlist(aggregate(ColB~ColA, df, function(x) head(x, 1))[2]), ]

#    ColA   ColB    ColC
#1     A    Red  7thing
#2     A    Red  OneBot
#4     B  Green  Thing7
#5     B  Green Twosies
#6     B  Green  Square
#11    C Orange    Cube

答案 2 :(得分:3)

由于它是一个大数据集,使用data.table的方法是

library(data.table)
setDT(df1)[df1[, .I[ColB==ColB[1L]], ColA]$V1]
#   ColA   ColB    ColC
#1:    A    Red  7thing
#2:    A    Red  OneBot
#3:    B  Green  Thing7
#4:    B  Green Twosies
#5:    B  Green  Square
#6:    C Orange    Cube

.SD

setDT(df1)[, .SD[ColB==ColB[1L]], ColA]

答案 3 :(得分:2)

您可以使用dplyr来完成您想要的任务:

library(dplyr)
df2 <- df1 %>% group_by(ColA) %>% filter(ColB == first(ColB))

首先group_by ColA,然后filter仅保留ColB等于firstColB值的行。使用您的数据的结果是:

print(df2)
##Source: local data frame [6 x 3]
##Groups: ColA [3]
##
##    ColA   ColB    ColC
##  <fctr> <fctr>  <fctr>
##1      A    Red  7thing
##2      A    Red  OneBot
##3      B  Green  Thing7
##4      B  Green Twosies
##5      B  Green  Square
##6      C Orange    Cube