【问题标题】:How to select 2nd and 3rd row for each group in R如何为R中的每个组选择第二行和第三行
【发布时间】:2015-09-18 11:12:52
【问题描述】:

我需要为数据框中的每个组选择第二个和第三个条目。我一直在尝试,但出现错误。

样本数据:

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是原始数据集中餐厅的列号。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    先复制餐厅列,然后使用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])
    }))
    

    【讨论】:

    • 我打算用data.table发几乎一样的东西,所以我把它放在这里library(data.table) ; setDT(df)[, `:=`(restaurant_2 = restaurant[2L], restaurant_3 = restaurant[3L]), by = USER.ID]
    • 或者不使用transmute()nth()重新复制第一列:df %&gt;% group_by(USER.ID) %&gt;% transmute(restaurant2 = nth(restaurant, 2), restaurant3 = nth(restaurant, 3))
    • @people!就是这样。我不拥有这些答案,所以请随意使用编辑按钮:-)
    【解决方案2】:

    如果您在数据框的行名中有一个简单的顺序,使用模运算符也可能是一种方法(以下选择每个第 2 行,将 2 更改为 n 以选择每个第 n 行):

    mydf %>% filter(as.numeric(row.names(.)) %% 2 == 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2023-02-07
      • 2022-08-02
      • 1970-01-01
      • 2014-08-16
      • 2016-02-25
      相关资源
      最近更新 更多