我有两个数据帧,结构如下:
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)上拆分两个数据帧。
提前感谢任何建议!
答案 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