таблица сопряженности из фрейма данных, сохраняя первый столбец в качестве ссылки - PullRequest
2 голосов
/ 18 апреля 2019

Вот мой входной фрейм данных:

df <- data.frame(Col1=c("A", "B", "C", "B", "C", "A", "A", "C"),Col2=c("Blue", "Red", "Blue", "Blue", "Blue", "Red", "Red", "Blue"),Col3=c("Young", "Old", "Old", "Young", "Young", "Young", "Old", "Old"))

df
Col1 Col2  Col3
1    A Blue Young
2    B  Red   Old
3    C Blue   Old
4    B Blue Young
5    C Blue Young
6    A  Red Young
7    A  Red   Old
8    C Blue   Old

Я пытаюсь получить таблицу непредвиденных обстоятельств, как показано ниже:

   Blue   Red   Young   Old
A     1     2       2     1
B     1     1       1     1
C     3     0       1     2

Я почти там со следующей командой, но Col2 и Col3объединены вместе:

as.data.frame(table(df)) %>% dcast(Col1 ~ Col2 + Col3, value.var="Freq")
  Col1 Blue_Old Blue_Young Red_Old Red_Young
1    A        0          1       1         1
2    B        0          1       1         0
3    C        2          1       0         0

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Использование table:

cbind(table(df$Col1,df$Col2),table(df$Col1,df$Col3))

#   Blue Red Old Young
#A    1   2   1     2
#B    1   1   1     1
#C    3   0   2     1
2 голосов
/ 18 апреля 2019

Опция base R, которая может работать с любым количеством столбцов, может быть

do.call(cbind, lapply(df[-1], function(i) table(df$Col1, i)))
#  Blue Red Old Young
#A    1   2   1     2
#B    1   1   1     1
#C    3   0   2     1
2 голосов
/ 18 апреля 2019

Один из вариантов: gather для 'Col2', 'Col3' для длинного формата, получить count для 'Col1' и столбец 'val', затем spread для возврата в 'широкий' формат

library(tidyverse)
df %>% 
  gather(key, val, Col2:Col3) %>% 
  count(Col1, val) %>% 
  spread(val, n, fill = 0)
# A tibble: 3 x 5
#  Col1   Blue   Old   Red Young
#  <fct> <dbl> <dbl> <dbl> <dbl>
#1 A         1     1     2     2
#2 B         1     1     1     1
#3 C         3     2     0     1

Поскольку OP использовал dcast, компактный вариант -

library(data.table)
dcast(melt(setDT(df), id.var = 'Col1'), Col1~ value)
#   Col1 Blue Old Red Young
#1:    A    1   1   2     2
#2:    B    1   1   1     1
#3:    C    3   2   0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...