【问题标题】:Create path without looping through rows of data frame创建路径而不遍历数据框行
【发布时间】:2017-07-04 08:10:00
【问题描述】:

假设我有一个数据框,其中包含不同人员和位置的信息。

Person <- c('A','A','A','B','B','C')
Place  <- c('Ber','Mun','Stu','LA','NY','Ber')

df <- as.data.frame(cbind(Person,Place))

现在我想要一个新的数据框来告诉我这个人是如何旅行的。它应该看起来像这样:

Person From  To
A       Ber   Mun
A       Mun   Stu
B        LA   NY

我可以通过遍历数据框来做到这一点。但我想对几百万行执行此操作。有人没有更好的方法吗?

最好, 费利克斯

【问题讨论】:

    标签: r loops for-loop dataframe


    【解决方案1】:

    我们可以使用data.table。将“data.frame”转换为“data.table”,按“Person”分组,将“Place”更改为“From”并通过“Place”的“lead”创建“To”,然后删除行'To'中有NA的地方

    library(data.table)
    setDT(df)[ ,.(From = Place, To =shift(Place, type = 'lead')), Person][!is.na(To)]
    #   Person From  To
    #1:      A  Ber Mun
    #2:      A  Mun Stu
    #3:      B   LA  NY
    

    也可以用tidyverse完成

    library(dplyr)
    df %>%
       group_by(Person) %>%
       transmute(From = Place, To = lead(Place)) %>%
       filter(!is.na(To))
    # A tibble: 3 x 3
    # Groups:   Person [2]
    #  Person  From    To
    #   <chr> <chr> <chr>
    #1      A   Ber   Mun
    #2      A   Mun   Stu
    #3      B    LA    NY
    

    【讨论】:

    • 太好了,我知道有更好的方法!我试图投票给你,但显然我在下面的声誉是 15。对不起。
    【解决方案2】:

    我将 df 的两个子集并排放置,一个没有头,一个没有尾,然后只有当人在每一侧都相同时才保留结果:

    library(magrittr)
    df2 <- df[-nrow(df),] %>%
      cbind(df[-1,]) %>%
      setNames(c("Person","From","Person2","To")) %>%
      subset(Person == Person2) %>%
      '['(,-3)
    
    #   Person From  To
    # 1      A  Ber Mun
    # 2      A  Mun Stu
    # 4      B   LA  NY
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多