2015-08-12 2 views
1

У меня есть данные, отражающие ширину рек через каждый континент. Ниже приведен образец данных. Я просто хочу получить данные в форме, которую я показал.Как расплавить или переформатировать данные в R?

dat <- read.table(text =  
         "width continent bin 
         5.32  Africa 10 
         6.38  Africa 10 
         10.80 Asia 20 
         9.45  Africa 10 
         22.66 Africa 30 
         9.45  Asia 10",header = TRUE) 

Как расплавить вышеуказанный набор данных игрушек, чтобы создать этот DataFrame?

Bin Count Continent 
10 3  Africa 
10 1  Asia 
20 1  Asia 
30 1  Africa 

ответ

5

Мы могли бы использовать любой из агрегатов по группам.

Опция data.table будет преобразовать «data.frame» в «data.table» (setDT(dat)), сгруппированных по «континент» и переменные «бин», мы получим число элементов в каждой группе (. N)

library(data.table) 
setDT(dat)[,list(Count=.N) ,.(continent,bin)] 
# continent bin Count 
#1: Africa 10  3 
#2:  Asia 20  1 
#3: Africa 30  1 
#4:  Asia 10  1 

Или подобный вариант с dplyr путем группирования переменных, а затем использовать n() вместо .N, чтобы получить количество.

library(dplyr) 
dat %>% 
     group_by(continent, bin) %>% 
     summarise(Count=n()) 

Или мы можем использовать aggregate из base R и используя метод формулу, мы получим length.

aggregate(cbind(Count=width)~., dat, FUN=length) 
# continent bin Count 
#1 Africa 10  3 
#2  Asia 10  1 
#3  Asia 20  1 
#4 Africa 30  1 

От @ Франка и комментарии @David Arenburg, некоторые дополнительные опции, используя data.table и dplyr. Мы превращаем набор данных в data.table (setDT(dat)), конвертировать в 'широкий' формат с dcast, а затем переконвертировать его обратно в 'длинный', используя melt и подмножество в roww (value>0)

library(data.table) 
melt(dcast(setDT(dat),continent~bin))[value>0] 

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

library(dplyr) 
count(dat, bin, continent) 
+1

Ради использованием 'melt', как указано в названии:' setDT (расплава (dcast (DAT, континент ~ бен))) [значение> 0] '' – Frank

+0

Кроме того, подсчет (DAT , bin, continent) ' –

2

sqldf С:

library(sqldf) 
sqldf("SELECT bin, continent, COUNT(continent) AS count 
     FROM dat 
     GROUP BY bin, continent") 

Выход:

bin continent count 
1 10 Africa  3 
2 10  Asia  1 
3 20  Asia  1 
4 30 Africa  1 
+0

Вы можете добавить' sqldf' – akrun

+0

@akrun еще раз спасибо – mpalanco

Смежные вопросы