2017-07-04 179 views
0

想象一下,我有一个数据帧,其中包含不同人员的信息和位置。创建没有循环遍历数据帧的路径

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 

我可以通过循环数据帧来完成。但是我想为此做好几百万行。有人没有更好的办法吗?

最佳, 费利克斯

回答

1

我们可以使用data.table。将'data.frame'转换为'data.table',按'Person'分组,将'Place'改为'From'并通过'Place'的'lead'创建'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

太棒了,我知道有更好的方法!我试图给你投票,但显然我下面的声望是15.对不起。 – Felix

+0

@Felix谢谢你的提示。你也可以勾选[here](https://stackoverflow.com/help/someone-answers) – akrun

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