我有一个数据集,其示例可以用以下表示:
EXEC('Select
trim(field1) field1
CVDATE(date1) date1
from tabel1
where trim(field1) <> 'ABC' ') at AE --linked server
我试图将ORIGIN和DEST组合在一起形成ROUTE,然后按路线聚合行,而不考虑原点或目的地,以获得总乘客数。
理想情况下,我想要以下内容:
ORIGIN <- c("SFO", "BOS", "LAX", "BOS")
DEST <- c("BOS", "SFO", "BOS", "LAX")
PASS<- c(100,50,20,40)
df = data.frame(ORIGIN, DEST, ROUTE, PASS)
ORIGIN DEST PASS
SFO BOS 100
BOS SFO 50
LAX BOS 20
BOS LAX 40
我不关心哪条路线命名指标占优势,只要我能将它们组合起来。
作为第一步,我使用了这个:
ROUTE PASS
SFO-BOS 150
LAX-BOS 60
要获得以下内容:
df$ROUTE<-paste(df$ORIGIN, df$DEST, sep="-")
然而,虽然我通常会使用像ddply这样的东西来获得乘客总和,但我不确定如何继续进行,因为我试图结合&#34; BOS-SFO&#34;和&#34; SFO-BOS&#34;。
这在小文件中不是问题,但我使用的文件过大。
有人能帮忙吗?
答案 0 :(得分:1)
这是pmax
和pmin
的用途。使用dplyr
:
df %>%
mutate(start = pmin(ORIGIN, DEST),
end = pmax(ORIGIN, DEST)) %>%
group_by(start, end) %>%
summarize(PASS = sum(PASS))
# start end PASS
# 1 BOS LAX 60
# 2 BOS SFO 150
答案 1 :(得分:0)
在基础R中使用mapply
来组合结果,
# sort each pair of dest and origin by row and paste results.
df$ROUTE <- mapply(function(x, y) paste(sort(c(x, y)), collapse="-"),
df$ORIGIN, df$DEST, USE.NAMES=FALSE)
aggregate(PASS ~ ROUTE, data=df, sum)
ROUTE PASS
1 BOS-LAX 60
2 BOS-SFO 150
数据强>
请注意,此方法需要使用字符变量而不是因子变量。 data.frame,df的构造如下。
df = data.frame(ORIGIN, DEST, PASS, stringsAsFactors=FALSE)