R 将行汇总为一行(连续变量和因子变量)

标签 r dplyr

我试图将一天的一堆行卷成一行。如果可能的话,我希望它在 dplyr 中。我知道我的代码远非正确,但这是我得到的程度:

data %>%
  group_by(DAY) %>%
  summarise_each(funs(Sum = n()), SEX, GROUP, TOTAL)

原来的:
DAY SEX GROUP   TOTAL       
7/1/14  FEMALE  A   1       
7/1/14  FEMALE  B   1       
7/1/14  FEMALE  B   1       
7/1/14  FEMALE  A   1       
7/1/14  MALE    A   1       
7/1/14  MALE    B   2       

新的:
DAY     FEMALE  MALE    GROUP_A GROUP_B TOTAL
7/1/14  4       2       3       3       7  

最佳答案

另一种方式与 data.table ,在 data.frame 上测试超过一天。

require(data.table)
setDT(data)[, as.list(c(table(SEX), table(GROUP), TOTAL=sum(TOTAL))), by=DAY]

#      DAY FEMALE MALE A B TOTAL
#1: 7/1/14      3    0 1 2     3
#2: 8/1/14      1    2 2 1     4

编辑:由于@jangorecki 和@DavidArenburg 的一些帮助,另一个更少手动的选项(您不需要知道哪些变量是因子,哪些是数字)
wh_num <- sapply(data, is.numeric)[-1]
wh_fact <-sapply(data, is.factor)[-1]
setDT(data)[, as.list(c(lapply(.SD[, wh_fact, with = FALSE], table), 
                        lapply(.SD[, wh_num, with = FALSE], sum), 
                        recursive = TRUE)), by = DAY]

#      DAY SEX.FEMALE SEX.MALE GROUP.A GROUP.B TOTAL
#1: 7/1/14          3        0       1       2     3
#2: 8/1/14          1        2       2       1     4

数据
data <- structure(list(DAY = c("7/1/14", "7/1/14", "7/1/14", "8/1/14", 
"8/1/14", "8/1/14"), SEX = structure(c(1L, 1L, 1L, 1L, 2L, 2L
), .Label = c("FEMALE", "MALE"), class = "factor"), GROUP = structure(c(1L, 
2L, 2L, 1L, 1L, 2L), .Label = c("A", "B"), class = "factor"), 
    TOTAL = c(1L, 1L, 1L, 1L, 1L, 2L)), .Names = c("DAY", "SEX", 
"GROUP", "TOTAL"), row.names = c(NA, -6L), class = "data.frame")

关于R 将行汇总为一行(连续变量和因子变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470309/

相关文章:

r - 将字符串转换为定义小数位数的数字

matlab - 从均值、变异系数生成对数正态分布的随机数

r - 使用 R 对链接的唯一 ID 对进行分组

r - 如何将字符串传递给函数中的 dplyr 过滤器?

r - 如何按第二个数据框中列出的任意标识符进行过滤?

r - 如何计算每个类别中的非零值

R删除数据框中的多个文本字符串

r - ggplot : how to add common x and y labels to a grid of plots

r - 如何计算 r 中的索引?

r - 基于条件语句使用 mutate() 计算有序观测值