Как мне расплавить или изменить форму бинарных данных в 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)

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

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

person Jason Matney    schedule 12.08.2015    source источник


Ответы (2)


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

Параметр 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

Из комментариев @Frank и @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)
person akrun    schedule 12.08.2015
comment
Ради использования melt как указано в заголовке: setDT(melt(dcast(dat,continent~bin)))[value>0] - person Frank; 13.08.2015
comment
Также count(dat, bin, continent) - person David Arenburg; 13.08.2015

С 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
person mpalanco    schedule 12.08.2015
comment
Вы можете добавить sqldf - person akrun; 13.08.2015
comment
@akrun еще раз спасибо - person mpalanco; 13.08.2015