首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择R中每组的第二次观察

选择R中每组的第二次观察
EN

Stack Overflow用户
提问于 2015-03-25 20:24:42
回答 3查看 1.4K关注 0票数 3

我觉得这应该很简单,但我想不出来。我想从一个数据帧中按组选择第二个观察。

例如:

代码语言:javascript
复制
Row Number    Email 
           1             xxxx
           2             xxxx
           3             xxxx
           4             xxxx
           5             xxxx
           6             yyyy
           7             yyyy
           8             zzzz
           9             zzzz
           10            zzzz
           11            zzzz
           12            zzzz

我想:

代码语言:javascript
复制
Row Number    Email 
           2             xxxx
           7             yyyy
           9             zzzz

看来,data.table解决方案和聚合解决方案正在跳过它们应该捕获的一组电子邮件。下面是它应该捕获的前6秒行:

代码语言:javascript
复制
Row Number   emails   expected output   actual output
1            aaaa
2            aaaa     aaaa              aaaa
3            aaaa
4            aaaa
5            aaaa
6            aaaa
7            aaaa
8            bbbb
9            bbbb     bbbb              bbbb
10           cccc
11           cccc     cccc              cccc
12           cccc
13           cccc
14           cccc
15           cccc
16           cccc
17           dddd     NA
18           eeee
19           eeee     eeee
20           eeee
21           ffff
22           ffff     ffff              ffff

电子邮件'eeee‘在数据集中有一行,所以我希望安娜排在这一行。电子邮件'dddd‘在原始数据集中有三行,所以我希望这封电子邮件的第二行,但它不在那里。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-25 20:29:01

或者使用data.table

代码语言:javascript
复制
library(data.table)
setDT(df)[, .SD[2L], by = Email]
#    Email Row.Number
# 1:  xxxx          2
# 2:  yyyy          7
# 3:  zzzz          9

或有基R

代码语言:javascript
复制
aggregate(. ~ Email, df, function(x) x[2L])
#   Email Row.Number
# 1  xxxx          2
# 2  yyyy          7
# 3  zzzz          9

编辑:使用新的数据集

代码语言:javascript
复制
df <- read.table(text = "'Row Number'   emails
                1            aaaa
                 2            aaaa             
                 3            aaaa
                 4            aaaa
                 5            aaaa
                 6            aaaa
                 7            aaaa
                 8            bbbb
                 9            bbbb  
                 10           cccc
                 11           cccc   
                 12           cccc
                 13           cccc
                 14           cccc
                 15           cccc
                 16           cccc
                 17           dddd
                 18           eeee
                 19           eeee     
                 20           eeee
                 21           ffff
                 22           ffff", header = TRUE)

运行代码

代码语言:javascript
复制
setDT(df)[, .SD[2L], by = emails]
#    emails Row.Number
# 1:   aaaa          2
# 2:   bbbb          9
# 3:   cccc         11
# 4:   dddd         NA
# 5:   eeee         19
# 6:   ffff         22
票数 3
EN

Stack Overflow用户

发布于 2015-03-25 20:31:39

尝尝这个。不需要一揽子方案:

代码语言:javascript
复制
subset(DF, ave(RowNumber, Email, FUN = seq_along) == 2)

代码语言:javascript
复制
DF[ ave(DF$RowNumber, DF$Email, FUN = seq_along) == 2, ]

使用下面注中所示的数据,这两行都会产生三行:

代码语言:javascript
复制
  RowNumber Email
2         2  xxxx
7         7  yyyy
9         9  zzzz

示例数据没有单行组,问题也没有指定如何处理这些组,但是这些答案不会为这些组生成任何行。我认为您会发现,有些答案给出了相同的结果,而另一些则给出了将RowNumber字段设置为NA的行。

注:

我们将其用于输入数据DF

代码语言:javascript
复制
Lines <- "RowNumber    Email 
           1             xxxx
           2             xxxx
           3             xxxx
           4             xxxx
           5             xxxx
           6             yyyy
           7             yyyy
           8             zzzz
           9             zzzz
           10            zzzz
           11            zzzz
           12            zzzz"
DF <- read.table(text = Lines, header = TRUE)

下次请提供代码以创建问题中的输入数据。

票数 4
EN

Stack Overflow用户

发布于 2015-03-25 20:28:29

您可以使用包dplyr来尝试这一点。

代码语言:javascript
复制
d <- read.table(header = TRUE, text = "
Number    Email 
           1             xxxx
           2             xxxx
           3             xxxx
           4             xxxx
           5             xxxx
           6             yyyy
           7             yyyy
           8             zzzz
           9             zzzz
           10            zzzz
           11            zzzz
           12            zzzz")

library(dplyr)
group_by(d, Email) %>%
    slice(2)
#    Source: local data frame [3 x 2]
#    Groups: Email
#      Number Email
#    1      2  xxxx
#    2      7  yyyy
#    3      9  zzzz
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29265821

复制
相关文章

相似问题

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