创建路径而不循环遍历数据帧行

时间:2017-07-04 08:10:00

标签: r loops for-loop dataframe

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

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

我可以通过循环数据框来完成它。但我想这几百万行。有人没有更好的方法吗?

最佳, 菲利克斯

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我将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