R选择组中的第二个元素

时间:2014-03-06 17:05:41

标签: r select

我试图找到一种更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

有没有办法做到这一点而不诉诸于索引?提前感谢您无疑将成为一个灵魂破碎简单而优雅的解决方案!

3 个答案:

答案 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

包含splitlapplydo.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)