我试图找到一种更R-esque的方式来选择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
有没有办法做到这一点而不诉诸于索引?提前感谢您无疑将成为一个灵魂破碎简单而优雅的解决方案!
答案 0 :(得分:3)
我会使用data.table
:
library(data.table)
dt = data.table(df)
dt[,var1[2],by=group]
在我考虑它的时候,没有理由你不能用plyr
执行此操作:
ddply(df, .(group), function(x) x[2,])
答案 1 :(得分:3)
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, ]))
答案 2 :(得分:2)
base
替代方案,其中只有&#39; var1&#39;汇总:
aggregate(var1 ~ group, data = df, `[`, 2)
...或者如果您希望汇总数据框中的所有列,可以使用&#39;&#39;点符号&#39;:
aggregate(. ~ group, data = df, `[`, 2)