R - 使用 dcast 聚合具有变量名称的数据
R - Aggregate data with variable name using dcast
Python
R
的新人,所以请原谅这个幼稚的问题。
我有一个名为 metrics
的 R
数据框,其中包含四列:
我想将聚合级别(day
或 week
)作为变量传递给 dcast
以进行聚合。
agg_level <- c("week")
如果我在函数中硬编码 week
,它会正确汇总每周的数据:
met <- dcast(metrics, week ~ city, value.var = count, fun.aggregate = sum)
- 输出:
week
NYC
CHI
SF
2015-10-18
1
2
3
2015-10-25
4
5
6
如果我用变量替换 week
,它会失败。 (它汇总了 所有 周的数据。)
met <- dcast(metrics, agg_level ~ city, value.var = count, fun.aggregate = sum)
输出:
agg_level
NYC
CHI
SF
week
5
7
9
基于this,metrics[[agg_level]]
从变量中提取一列,但是失败了:
met <- dcast(m, [[agg_level]] ~ city, value.var = metric, fun.aggregate = sum)
Error in (function ... unexpected '[['
正确的做法是什么?
dcast 的公式参数期望传递给它的单词是 data.frame x 内的 column/variable 名称。它不承认或解决 "agg_level" 是一个变量的事实。因此,您有两个选择:
# Option 1
# Do some text operations to make the formula based on variables.
if(this==that) {agg_level <- 'week'} else {agg_level <- 'day'}
myFormula <- sprintf("%s ~ city", agg_level)
met <- dcast(metrics, as.formula(myFormula), sum, value.var = metric)
# Option 2 - Untested
# Take advantage of dcast's alternative to the formula notation and pass a list instead.
# No idea if this will work.
met <- dcast(metrics, list(.(agg_level),.(city)), sum, value.var=metric)
Python
R
的新人,所以请原谅这个幼稚的问题。
我有一个名为 metrics
的 R
数据框,其中包含四列:
我想将聚合级别(day
或 week
)作为变量传递给 dcast
以进行聚合。
agg_level <- c("week")
如果我在函数中硬编码 week
,它会正确汇总每周的数据:
met <- dcast(metrics, week ~ city, value.var = count, fun.aggregate = sum)
- 输出:
week
NYC
CHI
SF
2015-10-18
1
2
3
2015-10-25
4
5
6
如果我用变量替换 week
,它会失败。 (它汇总了 所有 周的数据。)
met <- dcast(metrics, agg_level ~ city, value.var = count, fun.aggregate = sum)
输出:
agg_level
NYC
CHI
SF
week
5
7
9
基于this,metrics[[agg_level]]
从变量中提取一列,但是失败了:
met <- dcast(m, [[agg_level]] ~ city, value.var = metric, fun.aggregate = sum)
Error in (function ... unexpected '[['
正确的做法是什么?
dcast 的公式参数期望传递给它的单词是 data.frame x 内的 column/variable 名称。它不承认或解决 "agg_level" 是一个变量的事实。因此,您有两个选择:
# Option 1
# Do some text operations to make the formula based on variables.
if(this==that) {agg_level <- 'week'} else {agg_level <- 'day'}
myFormula <- sprintf("%s ~ city", agg_level)
met <- dcast(metrics, as.formula(myFormula), sum, value.var = metric)
# Option 2 - Untested
# Take advantage of dcast's alternative to the formula notation and pass a list instead.
# No idea if this will work.
met <- dcast(metrics, list(.(agg_level),.(city)), sum, value.var=metric)