Вопрос:

Частота счета двух столбцов в R

r

32856 просмотра

7 ответа

1389 Репутация автора

У меня есть два столбца в кадре данных

2010  1
2010  1
2010  2
2010  2
2010  3
2011  1
2011  2

Я хочу посчитать частоту обоих столбцов и получить результат в этом формате

  y    m Freq
 2010  1 2
 2010  2 2
 2010  3 1
 2011  1 1
 2011  2 1 
Автор: Sunny Sunny Источник Размещён: 04.06.2012 10:04

Ответы (7)


4 плюса

7294 Репутация автора

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

sqldf("SELECT y, m, COUNT(*) as Freq
       FROM table1
       GROUP BY y, m")
Автор: Kshitij Размещён: 04.06.2012 10:11

33 плюса

3128 Репутация автора

Решение

Если ваши данные - это фрейм данных dfсо столбцами yиm

library(plyr)
counts <- ddply(df, .(df$y, df$m), nrow)
names(counts) <- c("y", "m", "Freq")
Автор: danas.zuokas Размещён: 04.06.2012 10:40

4 плюса

33462 Репутация автора

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

library(reshape2)
df_counts <- melt(table(df))
names(df_counts) <- names(df)
colnames(df_counts)[ncol(df_counts)] <- "count"
df_counts    

  y    m     count
1 2010 1     2
2 2011 1     1
3 2010 2     2
4 2011 2     1
5 2010 3     1
6 2011 3     0
Автор: Ben Размещён: 04.06.2012 02:23

3 плюса

389 Репутация автора

library(data.table)

oldformat <- data.table(oldformat)  ## your orignal data frame
newformat <- oldformat[,list(Freq=length(m)), by=list(y,m)]
Автор: ugh Размещён: 04.01.2013 11:12

8 плюса

684 Репутация автора

Более идиоматическая версия data.table ответа @ ugh будет выглядеть так:

library(data.table) # load package
df <- data.frame(y = c(rep(2010, 5), rep(2011,2)), m = c(1,1,2,2,3,1,2)) # setup data
dt <- data.table(df) # transpose to data.table
dt[, list(Freq =.N), by=list(y,m)] # use list to name var directly
Автор: Richard Размещён: 25.05.2015 01:40

10 плюса

80543 Репутация автора

Я еще не видел ответ dplyr . Код довольно прост.

library(dplyr)
rename(count(df, y, m), Freq = n)
# Source: local data frame [5 x 3]
# Groups: V1 [?]
#
#       y     m  Freq
#   (int) (int) (int)
# 1  2010     1     2
# 2  2010     2     2
# 3  2010     3     1
# 4  2011     1     1
# 5  2011     2     1

Данные:

df <- structure(list(y = c(2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 
2011L), m = c(1L, 1L, 2L, 2L, 3L, 1L, 2L)), .Names = c("y", "m"
), class = "data.frame", row.names = c(NA, -7L))
Автор: Rich Scriven Размещён: 19.04.2016 12:09

3 плюса

5329 Репутация автора

Вот простое базовое Rрешение с использованием table()иas.data.frame()

df2 <- as.data.frame(table(df1))
# df2 
     y m Freq
1 2010 1    2
2 2011 1    1
3 2010 2    2
4 2011 2    1
5 2010 3    1
6 2011 3    0

df2[df2$Freq != 0, ]
# output
     y m Freq
1 2010 1    2
2 2011 1    1
3 2010 2    2
4 2011 2    1
5 2010 3    1

Данные

df1 <- structure(list(y = c(2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 
                           2011L), m = c(1L, 1L, 2L, 2L, 3L, 1L, 2L)), .Names = c("y", "m"
                           ), class = "data.frame", row.names = c(NA, -7L))
Автор: nghauran Размещён: 05.03.2019 03:53
Вопросы из категории :
32x32