多个数据库上的ddply类型功能

时间:2014-08-05 20:18:58

标签: r dataframe plyr apply

我有两个数据帧,结构如下:

Dataframe A:

     id sqft traf month
1  1030   16   35     1
1  1030   15   32     2
2  1027    1   31     1
2  1027    2   31     2

数据框B:

      id price frequency month day
 1  1030     8       196     1   1
 2  1030     9       101     1  15
 3  1030    10       156     1  30
 4  1030     3       137     2   1
 5  1030     7       190     2  15
 6  1027     6       188     1   1
 7  1027     1       198     1  15
 8  1027     2       123     1  30
 9  1027     4       185     2   1
 10 1027     5       122     2  15

我想从这两列输出某些类型的摘要统计信息(以每个唯一ID为中心)。如果我想从Dataframe B获得每个月每个ID的平均价格(按ID和月分割),或者我想要每个ID的平均比率sqft与traf(按ID分割),那么ddply会很容易。 / p>

但是,如果我想从两个数据帧中组合变量,那将是一个潜在的解决方案。例如,如何获得每个ID /月(数据帧B)的平均价格除以每个ID /月的平方英尺?

测量数据帧的变化频率使得将它们组合起来并不容易。我到目前为止找到的唯一解决方案是将第一个数据帧提取到平均sqft / id / month,然后将该值传递给第二个数据帧上的第二个ddply调用。

有更高效/更少复杂的方法吗?我会在同一个变量(id和month)上拆分两个数据帧。

提前感谢任何建议!

2 个答案:

答案 0 :(得分:2)

对于样本数据,您可以merge这样的两个数据集(通过指定all.y = TRUE,您可以确保保留dfb的所有行,在这种情况下,相应的dfa的条目相应重复)

dfall <- merge(dfa, dfb, by = c("id", "month"), all.y=TRUE)

#     id month sqft traf price frequency day
#1  1027     1    1   31     6       188   1
#2  1027     1    1   31     1       198  15
#3  1027     1    1   31     2       123  30
#4  1027     2    2   31     4       185   1
#5  1027     2    2   31     5       122  15
#6  1030     1   16   35     8       196   1
#7  1030     1   16   35     9       101  15
#8  1030     1   16   35    10       156  30
#9  1030     2   15   32     3       137   1
#10 1030     2   15   32     7       190  15

然后,您可以像往常一样使用ddply

ddply(dfall, .(id, month), mutate, newcol = mean(price)/sqft)
#    id month sqft traf price frequency day    newcol
#1  1027     1    1   31     6       188   1 3.0000000
#2  1027     1    1   31     1       198  15 3.0000000
#3  1027     1    1   31     2       123  30 3.0000000
#4  1027     2    2   31     4       185   1 2.2500000
#5  1027     2    2   31     5       122  15 2.2500000
#6  1030     1   16   35     8       196   1 0.5625000
#7  1030     1   16   35     9       101  15 0.5625000
#8  1030     1   16   35    10       156  30 0.5625000
#9  1030     2   15   32     3       137   1 0.3333333
#10 1030     2   15   32     7       190  15 0.3333333

修改:如果您希望获得更好的效果,请考虑使用dplyr代替plyr。等效的dplyr代码(包括合并)是:

library(dplyr)

dfall <- dfb %>% 
  left_join(., dfa, by = c("id", "month")) %>%
  group_by(id, month) %>%
  dplyr::mutate(newcol = mean(price)/sqft)   # I added dplyr:: to avoid confusion with plyr::mutate

当然,您也可以查看data.table,这也非常有效。

AFAIK ddply并非旨在同时用于不同的数据框。

答案 1 :(得分:1)

dplyr在这里做得很好。此代码合并数据框,获取价格和平方英尺表示唯一ID /月组合,然后创建新变量pricePerSqft

require(dplyr)

dfa %>%
  left_join(dfb, by = c("id", "month")) %>%
  group_by(id, month) %>%
  summarize(
    avgPrice = mean(price),
    avgSqft = mean(sqft)) %>%
  mutate(pricePerSqft = round(avgPrice / avgSqft, 2))

结果如下:

    id month avgPrice avgSqft pricePerSqft
1 1027     1      3.0       1         3.00
2 1027     2      4.5       2         2.25
3 1030     1      9.0      16         0.56
4 1030     2      5.0      15         0.33