Вы хотите составить таблицу совместного вхождения из shop.*
переменных:
df[,2:4] <- sapply(df[,2:4], function(x) { ifelse(x=="", 0, 1) } )
1) Предположительно, это можно сделать с помощью ftable(xtabs(...))
, но я боролся с этим длявозраст и не мог получить это.Самое близкое, что я получил, это:
> ftable(xtabs(~ shop.1 + shop.2 + shop.3, df))
shop.3 0 1
shop.1 shop.2
0 0 0 1
1 1 0
1 0 1 1
1 3 0
2) Как показало @thelatemail, вы также можете:
# Transform your df from wide-form to long-form...
library(dplyr)
library(reshape2)
occurrence_df <- reshape2::melt(df, id.vars='customer.id') %>%
dplyr::filter(value==1)
customer.id variable value
1 a shop.1 1
2 b shop.1 1
3 c shop.1 1
4 d shop.1 1
5 e shop.1 1
6 c shop.2 1
7 d shop.2 1
8 e shop.2 1
9 f shop.2 1
10 a shop.3 1
11 g shop.3 1
На самом деле мы можем удалить столбец value
после фильтра, чтобы мы моглиpipe %>% select(-value)
customer.id variable
1 a shop.1
2 b shop.1
3 c shop.1
4 d shop.1
5 e shop.1
6 c shop.2
7 d shop.2
8 e shop.2
9 f shop.2
10 a shop.3
11 g shop.3
# затем тот же шаг кросс-процесса, что и ответ @ thelatemail:
crossprod(table(occurrence_df))
variable
variable shop.1 shop.2 shop.3
shop.1 5 3 1
shop.2 3 4 0
shop.3 1 0 2
(Сноски:
- Сначала ваши данные должны быть числовыми(или фактор), а не строка. Вы хотите преобразовать "x" в 1 и "" в 0.
- Если они являются строками, потому что они пришли из
read.csv
, используйте read.csv
arguments stringsAsFactors=TRUE
длясделайте их множителями, или colClasses
, чтобы сделать их числовыми, и посмотрите все эти дублирующие вопросы.)