我一直在理解如何做到这一点,但到目前为止,我找不到一个简单的解决方案。 我有以下数据集:
Itin Origin Destination Passengers
1 A B 1
1 B C 1
2 A B 3
3 E B 10
4 A C 2
5 E B 4
我尝试做的是基于Itin
变量,创建路径变量,同时保持乘客变量。
理解这一点的最简单方法是将其视为在某处进行正常飞行。例如,在Itin = 1
中,一名乘客从A到B从C到C.唯一需要保留的是原始A
目的地B
,目的地C
和乘客它是,等于1.就像下面的例子一样。
Path Passengers
A-B-C 1
A-B 3
E-B 10
A-C 2
E-B 4
我已经使用dplyr尝试了group_by的几个选项,因为它通常比基本选项更快,但我无法像第二个示例那样使用新变量Path获得结果。我也想过使用tidyr,但我不确定它在这里有什么用呢。 关于如何做到这一点的任何想法?
编辑:对于Path变量,如果最终为A-B-C
,A,B,C
或A B C
,则无关紧要,因为我只会查看语法。
答案 0 :(得分:2)
编辑使用data.table
df1<-read.table(text="Itin Origin Destination Passengers
1 A B 1
1 B C 1
2 A B 3
3 E B 10
4 A C 2
5 E B 4",header=TRUE, stringsAsFactors=FALSE)
library(data.table)
DT <-data.table(df1)
DT[,.(Passengers, Path = paste(Origin[1],paste(Destination, collapse = " "),
collapse = " ")), by=Itin]
Itin Passengers Path
1: 1 1 A B C
2: 1 1 A B C
3: 2 3 A B
4: 3 10 E B
5: 4 2 A C
6: 5 4 E B
这是我的dplyr
的原始解决方案:
df1<-read.table(text="Itin Origin Destination Passengers
1 A B 1
1 B C 1
2 A B 3
3 E B 10
4 A C 2
5 E B 4",header=TRUE, stringsAsFactors=FALSE)
library(dplyr)
df1 %>%
group_by(Itin) %>%
summarise(Passengers=max(Passengers),
Path = paste(Origin[1],paste(Destination, collapse = " "),
collapse = " "))
# A tibble: 5 × 3
Itin Passengers Path
<int> <int> <chr>
1 1 1 A B C
2 2 3 A B
3 3 10 E B
4 4 2 A C
5 5 4 E B
答案 1 :(得分:0)
阅读数据:
read.table(textConnection("Itin Origin Destination Passengers
1 A B 1
1 B C 1
2 A B 3
3 E B 10
4 A C 2
5 E B 4"), header=T, stringsAsFactors=F) -> df
在这种情况下使用基数R:
Path <- lapply(unique(df$Itin), function(it) {
x <- subset(df, Itin==it)
c(x$Origin[1], x$Destination)
})
new_df <- unique(df[,c("Itin", "Passengers")])
new_df$Path <- Path
> new_df
Itin Passengers Path
1 1 1 A, B, C
3 2 3 A, B
4 3 10 E, B
5 4 2 A, C
6 5 4 E, B