我想创建一个基于两列的大型数据框的子集,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),以变量为目标的...and子集似乎并不合适。
发布于 2016-08-25 09:29:01
基础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使用原始逻辑,您还可以仅对ColA/ColB的非重复记录执行merge:
merge(dat, dat[c("ColA","ColB")][!duplicated(dat$ColA),])发布于 2016-08-25 09:38:27
使用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发布于 2016-08-25 10:42:03
由于它是一个大型数据集,因此使用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]https://stackoverflow.com/questions/39135218
复制相似问题