2015-12-22 6 views
2

У меня есть следующий набор данных:конвертировать долго широкий формат с двумя факторами в R

sample.data <- data.frame(Step = c(1,2,3,4,1,2,1,2,3,1,1), 
          Case = c(1,1,1,1,2,2,3,3,3,4,5), 
          Decision = c("Referred","Referred","Referred","Approved","Referred","Declined","Referred","Referred","Declined","Approved","Declined"), 
          Reason = c("Docs","Slip","Docs","","Docs","","Slip","Docs","","","")) 

sample.data 

     Step Case Decision Reason 
1  1 1 Referred Docs 
2  2 1 Referred Slip 
3  3 1 Referred Docs 
4  4 1 Approved 
5  1 2 Referred Docs 
6  2 2 Declined 
7  1 3 Referred Slip 
8  2 3 Referred Docs 
9  3 3 Declined 
10 1 4 Approved 
11 1 5 Declined 

Возможно ли в R, чтобы перевести это в широком формате таблицы, с решениями по заголовку, и значение каждой соты, находящейся графа возникновения, например:

Case Referred Approved Declined Docs  Slip 
1   3   1   0  2  0 
2   1   0   1  1  0 
3   2   0   1  1  1 
4   0   1   0  0  0 
5   0   0   1  0  0 

ответ

2

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

library(reshape2) 
tmp <- melt(sample.data, id.var=c("Step", "Case")) 
tmp <- tmp[tmp$value!="",] 

dcast(tmp, Case ~ value, value.var="Case", length) 

вы получите:

Case Approved Declined Docs Referred Slip 
1: 1  1  0 2  3 1 
2: 2  0  1 1  1 0 
3: 3  0  1 1  2 1 
4: 4  1  0 0  0 0 
5: 5  0  1 0  0 0 

Использование data.table -package, вы можете использовать один и тот же melt и dcast функциональность как с reshape2, но вам не нужен временный фрейм данных:

library(data.table) 
dcast(melt(setDT(sample.data), id.var=c("Step", "Case"))[value!=""], 
     Case ~ value, value.var="Case", length) 

, который даст вам тот же результат.

3
library(reshape2) 

df1 <- dcast(sample.data, Case~Decision+Reason) 
names(df1)[2:5] <- c("Approved", "Declined", "Docs", "Slip") 
df1$Referred <- df1$Docs + df1$Slip 

df1 
# Case Approved Declined Docs Slip Referred 
# 1: 1  1  0 2 1  3 
# 2: 2  0  1 1 0  1 
# 3: 3  0  1 1 1  2 
# 4: 4  1  0 0 0  0 
# 5: 5  0  1 0 0  0 
+0

Как я уже говорил с самыми длинными и широкоформатными вопросами здесь, это не приводит к результату, который я ищу. Функция 'dcast' дает результаты для комбинации двух факторов, в которых мой вывод сохраняет их отдельно. – dGecko

+0

Да. Ты прав. Возможно, вам нужно работать с результатом 'dcast'. Возможно, нужный результат, который вы показали, был неправильным. Пожалуйста, проверьте. –

+0

Хорошее использование 'dcast', плюс одно! – akrun

2

Мы можем использовать gather/spread из tidyr

library(tidyr) 
library(dplyr) 
gather(sample.data, Var, Val, 3:4) %>% 
      group_by(Case, Val) %>% 
      summarise(n=n()) %>% 
      filter(Val!='') %>% 
      spread(Val, n, fill=0) 

# Case Approved Declined Docs Referred Slip 
# (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
#1  1  1  0  2  3  1 
#2  2  0  1  1  1  0 
#3  3  0  1  1  2  1 
#4  4  1  0  0  0  0 
#5  5  0  1  0  0  0 
Смежные вопросы