重组、总结和合并变量
Regroup, summarise and combine variables
我一直在绞尽脑汁想知道如何做到这一点,但到目前为止我找不到简单的解决方案。
我有以下数据集:
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。唯一需要保留的是出发地 A
目的地 B
、目的地 C
和乘客它是,它等于 1。就像下面的例子一样。
Path Passengers
A-B-C 1
A-B 3
E-B 10
A-C 2
E-B 4
我已经用 group_by 和 dplyr 尝试了几个选项,因为它通常比基本选项更快,但我无法像第二个示例那样使用新变量 Path 真正得到结果。我也想使用 tidyr,但我不太确定它在这里有什么帮助。
知道如何做到这一点吗?
编辑:至于 Path 变量,如果以 A-B-C
、A,B,C
或 A B C
结束并不重要,因为我只会看语法。
读取数据:
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
EDIT 使用 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
我一直在绞尽脑汁想知道如何做到这一点,但到目前为止我找不到简单的解决方案。 我有以下数据集:
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。唯一需要保留的是出发地 A
目的地 B
、目的地 C
和乘客它是,它等于 1。就像下面的例子一样。
Path Passengers
A-B-C 1
A-B 3
E-B 10
A-C 2
E-B 4
我已经用 group_by 和 dplyr 尝试了几个选项,因为它通常比基本选项更快,但我无法像第二个示例那样使用新变量 Path 真正得到结果。我也想使用 tidyr,但我不太确定它在这里有什么帮助。 知道如何做到这一点吗?
编辑:至于 Path 变量,如果以 A-B-C
、A,B,C
或 A B C
结束并不重要,因为我只会看语法。
读取数据:
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
EDIT 使用 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