【问题标题】:Count combinations by column, order doesn't matter按列计算组合,顺序无关紧要
【发布时间】:2018-07-19 18:31:11
【问题描述】:
dat <- data.frame(A = c("r","t","y","g","r"),
                  B = c("g","r","r","t","y"),
                  C = c("t","g","t","r","t"))

  A B C
1 r g t
2 t r g
3 y r t
4 g t r
5 r y t

我想列出在三列中一起出现的字符,忽略顺序。 例如

Combinations  Freq
r t g         3
y t r         2

如果我想添加名义变量(例如性别)的频率计数,我该怎么做?

例如

dat <- data.frame(A = c("r","t","y","g","r"),
                  B = c("g","r","r","t","y"),
                  C = c("t","g","t","r","t"),
             Gender = c("male", "female", "female", "male", "male"))

dat

  A B C Gender
1 r g t   male
2 t r g female
3 y r t female
4 g t r   male
5 r y t   male

要得到这个:

Combinations  Freq   Male   Female
r t g         3      2       1
y t r         2      1       1

【问题讨论】:

  • 这里的礼仪通常是在发布答案后不对问题进行重大修改,除非回答者期待它。顺便说一句,你对新东西的格式有点不对劲。缩进四个空格以制作代码块,或突出显示并按 CTRL+K。您在那里使用内联代码格式。
  • 抱歉。我是新来的。谢谢你的提示。我不知道如何去询问后续,我正在使用这个帖子:meta.stackexchange.com/questions/10243/… 作为指导。另外,我可能不小心删除了您对后续的回答,我会尽力解决这个问题。
  • 是的,很好找。我同意 Shog 的“如果后续问题的答案可以很容易地转化为现有答案,那么应该在评论中提出并通过对该答案的编辑来回答。”问题是您无法真正知道扩展是否容易(否则您不需要询问它:))。因此,我会在轮询所有回答者方面犯错,如果有人说“不,我不想为此编辑”,那么请考虑提出一个新问题,因为您的编辑将使现有答案无效/不完整。

标签: r combinations


【解决方案1】:

你可以...

data.frame(table(combo = sapply(split(as.matrix(dat), row(dat)), 
  function(x) paste(sort(x), collapse=" "))))

  combo Freq
1 g r t    3
2 r t y    2

为了可读性,我建议多行和/或使用 magrittr:

d = as.matrix(dat)
library(magrittr)

d %>% split(., row(.)) %>% sapply(
  . %>% sort %>% paste(collapse = " ")
) %>% table(combo = .) %>% data.frame

  combo Freq
1 g r t    3
2 r t y    2

重新编辑/新问题,我会采取一些不同的方法,也许像...

# new example data
dat <- data.frame(A = c("r","t","y","g","r"), B = c("g","r","r","t","y"), C = c("t","g","t","r","t"),Gender = c("male", "female", "female", "male", "male"))

library(data.table)
setDT(dat)

dat[, combo := sapply(transpose(.SD), 
  . %>% sort %>% paste(collapse = " ")), .SDcols=A:C]

dat[, c(
  n = .N, 
  Gender %>% factor(levels=c("male", "female")) %>% table %>% as.list
), by=combo]

   combo n male female
1: g r t 3    2      1
2: r t y 2    1      1

【讨论】:

  • 顺便说一句,我刚刚在包含变量性别的dat 框架上运行了您提供的第一个解决方案(data.frame),它只是将变量强制转换为输出并提供了答案第二个问题。所以,本质上,你用一块石头杀死了两只鸟!
【解决方案2】:
library(tidyverse)

dat %>% 
  pmap_dfr(~list(...)[order(c(...))] %>% set_names(names(dat))) %>%
  group_by_all %>% 
  count

# # A tibble: 2 x 4
# # Groups:   A, B, C [2]
#   A     B     C         n
#   <chr> <chr> <chr> <int>
# 1 g     r     t         3
# 2 r     t     y         2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多