基于不同顺序的字符串聚合行

时间:2017-02-07 22:31:18

标签: r merge row col

我有一个数据集,其示例可以用以下表示:

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;。

这在小文件中不是问题,但我使用的文件过大。

有人能帮忙吗?

2 个答案:

答案 0 :(得分:1)

这是pmaxpmin的用途。使用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)