如何 select R 中每个组的第 2 行和第 3 行
How to select 2nd and 3rd row for each group in R
我需要 select 数据框中每个组的第 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
期望的输出:
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是餐厅在原始数据集中的列号。
先复制餐厅列,然后使用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:
mydf[c("restaurant_2", "restaurant_3")] <- with(mydf, lapply(c(2, 3), function(x) {
ave(restaurant, USER.ID, FUN = function(y) y[x])
}))
如果您的数据框的行名称有一个简单的顺序,使用模运算符也可能是一种方法(以下每个第 2 行 selects,将 2 更改为 n 为 select 每第 n 行):
mydf %>% filter(as.numeric(row.names(.)) %% 2 == 0)
我需要 select 数据框中每个组的第 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
期望的输出:
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是餐厅在原始数据集中的列号。
先复制餐厅列,然后使用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:
mydf[c("restaurant_2", "restaurant_3")] <- with(mydf, lapply(c(2, 3), function(x) {
ave(restaurant, USER.ID, FUN = function(y) y[x])
}))
如果您的数据框的行名称有一个简单的顺序,使用模运算符也可能是一种方法(以下每个第 2 行 selects,将 2 更改为 n 为 select 每第 n 行):
mydf %>% filter(as.numeric(row.names(.)) %% 2 == 0)