gpt4 book ai didi

R 选择组中的第二个元素

转载 作者:行者123 更新时间:2023-12-03 23:23:58 27 4
gpt4 key购买 nike

我试图找到一种更 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的解决方案, lapplydo.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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com