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

时间:2015-03-25 20:24:43

标签: r

我觉得这应该是直截了当的,但我无法弄清楚。我想从数据框中按组选择第二个观察。

例如:

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

我想要:

Row Number    Email 
           2             xxxx
           7             yyyy
           9             zzzz

似乎data.table解决方案和聚合解决方案正在跳过他们应该捕获的电子邮件组。以下是它应捕获的前六秒行:

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'在数据集中有一行,所以我希望这一行有NA行。电子邮件'dddd'在原始数据集中有三行,所以我希望这封电子邮件的第二行,但它不存在。

3 个答案:

答案 0 :(得分:4)

试试这个。不需要包裹:

subset(DF, ave(RowNumber, Email, FUN = seq_along) == 2)

DF[ ave(DF$RowNumber, DF$Email, FUN = seq_along) == 2, ]

使用下面注释下显示的数据中的任何一个都会产生三行:

  RowNumber Email
2         2  xxxx
7         7  yyyy
9         9  zzzz

示例数据没有单个行组,问题没有指定如何处理这些组,但这些答案不会为这些组生成任何行。我想您会发现某些答案会产生相同的结果,而其他答案会将RowNumber字段设置为NA

注意:

我们将此用作输入数据DF

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)

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

答案 1 :(得分:3)

您可以使用包dplyr

尝试此操作
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

答案 2 :(得分:3)

或使用data.table

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

或者用基础R

aggregate(. ~ Email, df, function(x) x[2L])
#   Email Row.Number
# 1  xxxx          2
# 2  yyyy          7
# 3  zzzz          9

编辑:使用新数据集

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)

运行代码

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