我觉得这应该是直截了当的,但我无法弄清楚。我想从数据框中按组选择第二个观察。
例如:
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'在原始数据集中有三行,所以我希望这封电子邮件的第二行,但它不存在。
答案 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