Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为R中的每个组选择第二行和第三行_R_Dataframe_Dplyr - Fatal编程技术网

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

如何为R中的每个组选择第二行和第三行,r,dataframe,dplyr,R,Dataframe,Dplyr,我需要为数据帧中的每个组选择第二个和第三个条目。我一直在努力,但还是出错了 样本数据: 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   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])
data1%
排列(用户ID)%>%
分组依据(用户ID)%>%
突变(第二个餐厅=数据[2,11])%>%
变异(第三方餐厅=数据[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é):


或者,如果您更喜欢“data.table”来解释@davidernburg,您可以尝试:

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

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

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

mydf[c(“餐厅2”、“餐厅3”)]如果您的数据帧的行名称中有一个简单的顺序,使用模运算符也可能是一种方法(下面选择每第2行,将2更改为n以选择每第n行):


我打算用
data.table
发布几乎相同的内容,所以我将把它放在
库(data.table)中;setDT(df)[,`:=`(restaurant_2=restaurant[2L],restaurant_3=restaurant[3L]),by=USER.ID]
或不使用
transmute()
nth()
重新压缩第一列:
df%>%group_by(USER.ID)%%>%transmute(restaurant2=nth(restaurant,2),restaurant3=nth(restaurant,3))
@people!这是真的。我没有这些答案,所以请随意使用编辑按钮:-)
mydf[c("restaurant_2", "restaurant_3")] <- with(mydf, lapply(c(2, 3), function(x) {
  ave(restaurant, USER.ID, FUN = function(y) y[x])
}))
mydf %>% filter(as.numeric(row.names(.)) %% 2 == 0)