2016-05-14 3 views
1

Я пытаюсь сделать таблицу, отображающую количество коэффициентов уровня другим фактором. Для этого я просмотрел десятки страниц, вопросы ... пытаясь использовать функции в некоторых пакетах (dplyr, reshape), чтобы выполнить задание, без каких-либо успехов в их правильном использовании.Сводные показатели уровня фактора - в процентах

Вот что я получил:

# my data: 
var1 <- c("red","blue","red","blue","red","red","red","red","red","red","red","red","blue","red","blue") 
var2 <- c("0","1","0","0","0","0","0","0","0","0","1","0","0","0","0") 
var3 <- c("2","2","1","1","1","3","1","2","1","1","3","1","1","2","1") 
var4 <- c("0","1","0","0","0","0","1","0","1","1","0","1","0","1","1") 
mydata <- data.frame(var1,var2,var3,var4) 
head(mydata) 

Попытка п + 1: отображает только общий подсчет факторов еще один фактор.

t(aggregate(. ~ var1, mydata, sum)) 

     [,1] [,2] 
var1 "blue" "red" 
var2 " 5" "12" 
var3 " 5" "18" 
var4 " 6" "16" 

Попытка n + 2: это правильный формат, но я не мог заставить его работать более чем на один фактор.

library(dplyr) 
data1 <- ddply(mydata, c("var1", "var3"), summarise, 
      N = length(var1)) 
library(reshape) 
df1 <- cast(data1, var1 ~ var3, sum) 
df1 <- t(df1) 
df1 

    blue red 
1 3 6 
2 1 3 
3 0 2 

То, что я хотел бы это:

 blue red 
var2.0 3 10 
var2.1 1 1 
var3.1 3 6 
var3.2 1 3 
var3.3 0 2 
var4.0 2 6 
var4.1 2 5 

Как я могу получить этот формат? Так много спасибо заранее,

+1

yep, под редакцией. Благодаря! – Mareviv

ответ

3

Мы можем melt набор данных с помощью «var1», а затем использовать table

library(reshape2) 
tbl <- table(transform(melt(mydata, id.var="var1"), 
     varN = paste(variable, value, sep="."))[c(4,1)]) 
names(dimnames(tbl)) <- NULL 
tbl 
# 
#   blue red 
# var2.0 3 10 
# var2.1 1 1 
# var3.1 3 6 
# var3.2 1 3 
# var3.3 0 2 
# var4.0 2 6 
# var4.1 2 5 

Или с помощью dplyr/tidyr мы преобразуем набор данных из «широкий» в формат «длинного» с gather, затем unite столбцы ('var', 'val'), чтобы создать 'varV', получить частоту (tally) после группировки по 'var1' и 'varV', а затем spread в 'wide' формате.

library(dplyr) 
library(tidyr) 
gather(mydata, var, val, -var1) %>% 
      unite(varV,var, val, sep=".") %>% 
      group_by(var1, varV) %>% 
      tally() %>% 
      spread(var1, n, fill = 0) 
# varV blue red 
# <chr> <dbl> <dbl> 
#1 var2.0  3 10 
#2 var2.1  1  1 
#3 var3.1  3  6 
#4 var3.2  1  3 
#5 var3.3  0  2 
#6 var4.0  2  6 
#7 var4.1  2  5 
+0

Абсолютно блестящий! В частности, второй метод дает именно то, что мне нужно. Мне нужно время, чтобы понять, как вы используете каналы для заполнения data.frame. Мне действительно нужно научиться делать это для себя, большое спасибо за ваше объяснение! – Mareviv