我试图找到一种更 R 风格的方式来选择 R 中组的第二个元素(但不是第一个)。
我结束了: 1. 创建索引 rowNumIndex
; 2. 选择并将前两行放入一个数据框中,然后将前两行放入单独的数据框中;然后 3. “反向合并” 2 个数据框以仅从数据框中获得唯一值和前两行:
firsts <- ddply(df,.(group), function(x) head(x,1)) # 2 records using data below
seconds <- ddply(df,.(group), function(x) head(x,2)) # 4 records using data below
real.seconds <- seconds[!seconds$rowNumIndex %in% firsts$rowNumIndex, ] # 2 records, the second elements only
这是一些假装数据:
group var1 rowNumIndex
A 8 1
A 9 2
A 10 3
B 11 4
B 12 5
B 13 6
B 14 7
structure(list(group = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L
), .Label = c("A", "B"), class = "factor"), var1 = 8:14, rowNumIndex = 1:7), .Names = c("group",
"var1", "rowNumIndex"), class = "data.frame", row.names = c(NA,
-7L))
因此,数据框
firsts
好像:group var1 rowNumIndex
A 8 1
B 11 4
和数据框
seconds
好像:group var1 rowNumIndex
A 8 1
A 9 2
B 11 4
B 12 5
和数据框
real.seconds
好像:group var1 rowNumIndex
A 9 2
B 12 5
有没有办法在不求助于例如索引的情况下做到这一点?在此先感谢您提供的无疑是一个令人心碎的简单而优雅的解决方案!
最佳答案
与 dplyr
的解决方案:
library(dplyr)
group_by(df, group) %>% slice(2)
# group var1 rowNumIndex
# <fctr> <int> <int>
# 1 A 9 2
# 2 B 12 5
前
dplyr 0.3
选择:group_by(df, group)%.%filter(seq_along(var1)==2)
group var1 rowNumIndex
1 A 9 2
2 B 12 5
此解决方案将保留数据的所有列。如果你只想要两列(group 和 var),你可以这样做:
group_by(df, group)%.%summarise(var1[2])
group var1[2]
1 A 9
2 B 12
split
的解决方案, lapply
和 do.call
real.seconds<-do.call("rbind", lapply(split(df, df$group), function(x) x[2,]))
这会给你:
real.seconds
group var1 rowNumIndex
A A 9 2
B B 12 5
或者,更优雅地,使用
by
:real.seconds <- do.call(rbind, by(df, df$group, function(x) x[2, ]))
关于R 选择组中的第二个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22231201/