2017-07-04 70 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