我想基于两列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),这些看似不合适。
答案 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
等于first
中ColB
值的行。使用您的数据的结果是:
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