首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列中第一个变量的所有匹配项的r子集行数

列中第一个变量的所有匹配项的r子集行数
EN

Stack Overflow用户
提问于 2016-08-25 09:10:39
回答 4查看 745关注 0票数 0

我想创建一个基于两列的大型数据框的子集,ColA和ColB (如下所示)。对于ColA中的每个变量(例如A、B、C……),我希望提取与ColB中第一个变量的每个匹配项相对应的行。因此DF1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
ColA  ColB  ColC
A     Red     7thing
A     Red     OneBot
B     Green   Thing7
B     Green   Twosies
B     Green   Square
C     Orange  Cube

我不关心ColC中的重复项,并且ColB中变量的出现次数没有规律可循。我发现相关的子集策略侧重于提取独特的案例,但我既没有遇到也没有能力设计出一种方法来允许选择第一个变量类型的所有匹配项,并希望得到一些帮助。

我试过了

代码语言:javascript
复制
DF2 <- DF1[match(unique(DF1$ColB), DF1$ColB),]

当变量内容已知时(例如Subset first n occurrences of certain value in dataframe in R),以变量为目标的...and子集似乎并不合适。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-25 09:29:01

基础R中的ave的能力,将所有ColB病例与每组中的第一个ColB进行比较:

代码语言:javascript
复制
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

代码语言:javascript
复制
merge(dat, dat[c("ColA","ColB")][!duplicated(dat$ColA),])
票数 5
EN

Stack Overflow用户

发布于 2016-08-25 09:38:27

使用aggregate的另一种方法

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-08-25 10:42:03

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

代码语言:javascript
复制
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

代码语言:javascript
复制
setDT(df1)[, .SD[ColB==ColB[1L]], ColA]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39135218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档