运行 在迭代该字段的所有类别后对完整变量进行循环
Running a loop on the complete variable after iterating on all the categories of that field
我在 R 中工作,我有一个数据框,它由带有分类数据的列组成。对于这些类别的每一个组合,我都必须汇总一个指标。
输入table:
ID Region Access Touchpoints
A Central High 8
B Central Low 7
C West High 7
D West Low 3
E Central High 2
F Central Low 5
G West High 9
H West Low 8
我想要的输出:
Region Access Touchpoints
All All 49
All High 26
All Low 23
Central High 10
West High 16
Central Low 12
West Low 11
Central All 22
West All 27
问题是在嵌套循环中迭代这些变量时,我必须创建一个 All 类别。还有其他办法吗?
新答案
题目有点难解。但是提问者正在寻找的是几个分组变量中的聚合和总计。 data.table
中的 cube
函数是专门为这种情况设计的。
library(data.table)
df <- fread('ID Region Access Touchpoints
A Central High 8
B Central Low 7
C West High 7
D West Low 3
E Central High 2
F Central Low 5
G West High 9
H West Low 8')
result <- cube(df, j = sum(Touchpoints), by = c('Region', 'Access'))
请注意 cube
只接受 data.table
和 returns。有关 data.table
软件包的更多信息,我参考了他们出色的 cheat-sheet,例如 wiki here。在结果 NA
中标记组和子组的总数。我们可以改变这个并通过 运行
回到 data.frame
df[is.na(Region), Region = 'All'][is.na(Access), Access := 'All']
setDF(df) #Change back to DF (if wanted)
旧答案
由于缺少可重现的示例,这将是一个有限的答案。
根据您的数据大小和可用内存,针对这些情况的最简单方法是简单地创建一个包含所有组合的网格以进行迭代。存在多种方法。在基础 R
combinations <- expand.grid(var1, var2, var3, ...)
for(i in seq(nrow(combination))){
current_comb <- combinations[i, ]
#Do stuff
#...
}
#Alternative
#apply(combinations, 1, FUN)
对于 data.table
我们可以类似地使用 CJ(var1, var2, ...)
而对于 tidyverse
我们将使用 expand_grid
.
这通常要快得多,但随着类别数量的增加,这将变得越来越不可行。不过,在您的情况下应该没问题。
我在 R 中工作,我有一个数据框,它由带有分类数据的列组成。对于这些类别的每一个组合,我都必须汇总一个指标。
输入table:
ID Region Access Touchpoints
A Central High 8
B Central Low 7
C West High 7
D West Low 3
E Central High 2
F Central Low 5
G West High 9
H West Low 8
我想要的输出:
Region Access Touchpoints
All All 49
All High 26
All Low 23
Central High 10
West High 16
Central Low 12
West Low 11
Central All 22
West All 27
问题是在嵌套循环中迭代这些变量时,我必须创建一个 All 类别。还有其他办法吗?
新答案
题目有点难解。但是提问者正在寻找的是几个分组变量中的聚合和总计。 data.table
中的 cube
函数是专门为这种情况设计的。
library(data.table)
df <- fread('ID Region Access Touchpoints
A Central High 8
B Central Low 7
C West High 7
D West Low 3
E Central High 2
F Central Low 5
G West High 9
H West Low 8')
result <- cube(df, j = sum(Touchpoints), by = c('Region', 'Access'))
请注意 cube
只接受 data.table
和 returns。有关 data.table
软件包的更多信息,我参考了他们出色的 cheat-sheet,例如 wiki here。在结果 NA
中标记组和子组的总数。我们可以改变这个并通过 运行
df[is.na(Region), Region = 'All'][is.na(Access), Access := 'All']
setDF(df) #Change back to DF (if wanted)
旧答案
由于缺少可重现的示例,这将是一个有限的答案。
根据您的数据大小和可用内存,针对这些情况的最简单方法是简单地创建一个包含所有组合的网格以进行迭代。存在多种方法。在基础 R
combinations <- expand.grid(var1, var2, var3, ...)
for(i in seq(nrow(combination))){
current_comb <- combinations[i, ]
#Do stuff
#...
}
#Alternative
#apply(combinations, 1, FUN)
对于 data.table
我们可以类似地使用 CJ(var1, var2, ...)
而对于 tidyverse
我们将使用 expand_grid
.
这通常要快得多,但随着类别数量的增加,这将变得越来越不可行。不过,在您的情况下应该没问题。