【问题标题】:Aggregating Rows Based on Strings in different orders基于不同顺序的字符串聚合行
【发布时间】:2017-06-25 08:54:24
【问题描述】:

我有一个数据集,其中的一个样本可以用以下方式表示:

    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

我正在尝试将 ORIGIN 和 DEST 组合在一起以形成 ROUTE,然后按路线聚合行,而不考虑起点或目的地,以获得总乘客人数。

理想情况下,我想要以下内容:

ROUTE    PASS
SFO-BOS  150
LAX-BOS  60

我不关心哪个路由命名度量占主导地位,只要我能将它们结合起来。

作为第一步,我使用了这个:

df$ROUTE<-paste(df$ORIGIN, df$DEST, sep="-")

获取以下信息:

ORIGIN DEST   ROUTE    PASS
SFO    BOS    SFO-BOS  100
BOS    SFO    BOS-SFO  50
LAX    BOS    LAX-BOS  20
BOS    LAX    BOS-LAX  40

但是,虽然我通常会使用 ddply 之类的东西来获取乘客总和,但我不确定如何继续,因为我正在尝试结合“BOS-SFO”和“SFO-BOS”。

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

有人可以帮忙吗?

【问题讨论】:

标签: r merge row col


【解决方案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

【讨论】:

  • 是的。基本翻译 - df$ROUTE &lt;- interaction(do.call(pmin, lapply(df[c("ORIGIN","DEST")],as.character)), do.call(pmax, lapply(df[c("ORIGIN","DEST")],as.character)))aggregate(PASS ~ ROUTE, data=df, sum)
【解决方案2】:

在base 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2015-04-05
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多