想象一下,我有一个数据框,其中包含不同人员和位置的信息。
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
我可以通过循环数据框来完成它。但我想这几百万行。有人没有更好的方法吗?
最佳, 菲利克斯
答案 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