如何在R中选择每个组的第二行和第三行

5
我需要选择数据框中每个组的第二个和第三个条目。我一直在尝试,但出现错误。
样本数据:
USER.ID   restaurant
3            aaaa
3            ababa
3            asddw
4            bbbb
4            wedwe
2            ewedw
1            qwqw
1            dwqd
1            dqed
1            ewewq

期望输出:

USER.ID    2nd_restaurant   3rd_restaurant
3            ababa             asddw
3            ababa             asddw
3            ababa             asddw
4            wedwe             NA
4            wedwe             NA
2            NA                NA
1            dwqd              dqed
1            dwqd              dqed
1            dwqd              dqed
1            dwqd              dqed

我是一名有用的助手,可以为您翻译文本。

我尝试使用dplyr,但由于数据量巨大,计算时间很长。是否有更有效的方法进行计算?

我的代码:

data1 <- data %>%
arrange(USER.ID) %>%
group_by(USER.ID) %>%
mutate(second_restaurant = data[2,11]) %>%
mutate(third_restaurant = data[3,11])

11是原始数据集中餐厅的列号。

2个回答

8

首先复制餐厅列,然后使用mutate提取相关值:

mydf %>%
  mutate(restaurant2 = restaurant) %>%
  group_by(USER.ID) %>%
  mutate(restaurant = restaurant[2], restaurant2 = restaurant2[3])
# Source: local data frame [10 x 3]
# Groups: USER.ID
# 
#    USER.ID restaurant restaurant2
# 1        3      ababa       asddw
# 2        3      ababa       asddw
# 3        3      ababa       asddw
# 4        4      wedwe          NA
# 5        4      wedwe          NA
# 6        2         NA          NA
# 7        1       dwqd        dqed
# 8        1       dwqd        dqed
# 9        1       dwqd        dqed
# 10       1       dwqd        dqed

或者更好的方法(由@StevenBeaupré提供):
mydf %>% 
  group_by(USER.ID) %>% 
  transmute(restaurant2 = nth(restaurant, 2), 
            restaurant3 = nth(restaurant, 3))

如果你更喜欢使用"data.table",可以尝试以下方法(引用@DavidArenburg):

library(data.table)
as.data.table(mydf)[, `:=`(restaurant_2 = restaurant[2L], 
                           restaurant_3 = restaurant[3L]), by = USER.ID][]

或者,您甚至可以使用基本的R:

或者,您可以使用基本的R:

mydf[c("restaurant_2", "restaurant_3")] <- with(mydf, lapply(c(2, 3), function(x) {
  ave(restaurant, USER.ID, FUN = function(y) y[x])
}))

3
我几乎想要发布与 data.table 几乎相同的内容,所以我会在这里放置它:library(data.table) ; setDT(df)[, `:=`(restaurant_2 = restaurant[2L], restaurant_3 = restaurant[3L]), by = USER.ID] - David Arenburg
3
使用transmute()nth()函数,而不是重新复制第一列: df %>% group_by(USER.ID) %>% transmute(restaurant2 = nth(restaurant, 2), restaurant3 = nth(restaurant, 3)) - Steven Beaupré
1
@大家好!这是SO。我不拥有这些答案,所以请随意使用编辑按钮 :-) - A5C1D2H2I1M1N2O1R2T1

0
如果您的数据框中行名称是简单的顺序,使用模运算符也可能是一种方法(以下选择每个第二行,将2更改为n以选择每个第n行):
mydf %>% filter(as.numeric(row.names(.)) %% 2 == 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接