如何为R中的每个组选择第2行和第3行

Dhe*_*ngh 4 r dataframe dplyr

我需要为数据框中的每个组选择第2和第3个条目.我一直在尝试,但得到一个错误.

样本数据:

USER.ID   restaurant
3            aaaa
3            ababa
3            asddw
4            bbbb
4            wedwe
2            ewedw
1            qwqw
1            dwqd
1            dqed
1            ewewq
Run Code Online (Sandbox Code Playgroud)

期望的输出:

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
Run Code Online (Sandbox Code Playgroud)

我尝试使用dplyr,但我想由于数据量巨大,计算时间很长.有没有办法更有效地计算它?

我的代码:

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

11是原始数据集中的餐馆的列号.

A5C*_*2T1 6

首先复制餐厅列,然后使用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
Run Code Online (Sandbox Code Playgroud)

或者,更好的(礼貌@StevenBeaupré):

mydf %>% 
  group_by(USER.ID) %>% 
  transmute(restaurant2 = nth(restaurant, 2), 
            restaurant3 = nth(restaurant, 3))
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢"data.table",请翻译@DavidArenburg,您可以尝试:

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

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

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

  • 我打算用`data.table`发布几乎相同的内容,所以我把它放在```library(data.table); setDT(df)[,`:=`(restaurant_2 = restaurant [2L],restaurant_3 = restaurant [3L]),by = USER.ID]``` (3认同)
  • 或者不使用`transmute()`和`nth()`重新复制第一列:`df%>%group_by(USER.ID)%>%transmute(restaurant2 = nth(restaurant,2),restaurant3 = nth(restaurant, 3))` (2认同)