policz liczbę wierszy w ramce danych w R na podstawie grupy [duplikat]
To pytanie ma już odpowiedź tutaj:
- policz liczbę wierszy w każdej grupie 11 odpowiedzi
Mam ramkę danych w R
Tak:
ID MONTH-YEAR VALUE
110 JAN. 2012 1000
111 JAN. 2012 2000
. .
. .
121 FEB. 2012 3000
131 FEB. 2012 4000
. .
. .
Tak więc dla każdego miesiąca każdego roku są n
wiersze i mogą być w dowolnej kolejności (oznacza to, że wszystkie nie są w ciągłości i są w przerwach). Chcę obliczyć ile wierszy jest tam dla każdego MONTH-YEAR
tj. ile wierszy jest dla Jana. 2012, ile za luty 2012 i tak dalej. Coś takiego:
MONTH-YEAR NUMBER OF ROWS
JAN. 2012 10
FEB. 2012 13
MAR. 2012 6
APR. 2012 9
Próbowałem to zrobić:
n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))
Ale nie daje pożądanej wydajności.Jak mogę to zrobić?
8 answers
Oto przykład, który pokazuje, w jaki sposób table(.)
(lub, bardziej dopasowując pożądany wynik, data.frame(table(.))
robi to, o co prosisz.
Zwróć również uwagę na to, jak udostępniać powtarzalne przykładowe dane w sposób, który inni mogą kopiować i wklejać do swojej sesji.
Oto (powtarzalne) przykładowe dane:
mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L),
MONTH.YEAR = c("JAN. 2012", "JAN. 2012",
"FEB. 2012", "FEB. 2012",
"MAR. 2012"),
VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)),
.Names = c("ID", "MONTH.YEAR", "VALUE"),
class = "data.frame", row.names = c(NA, -5L))
mydf
# ID MONTH.YEAR VALUE
# 1 110 JAN. 2012 1000
# 2 111 JAN. 2012 2000
# 3 121 FEB. 2012 3000
# 4 131 FEB. 2012 4000
# 5 141 MAR. 2012 5000
Oto obliczenie liczby wierszy na grupę, w dwóch wyjściowych formatach wyświetlania:
table(mydf$MONTH.YEAR)
#
# FEB. 2012 JAN. 2012 MAR. 2012
# 2 2 1
data.frame(table(mydf$MONTH.YEAR))
# Var1 Freq
# 1 FEB. 2012 2
# 2 JAN. 2012 2
# 3 MAR. 2012 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:36:47
Funkcja count()
w plyr
robi to, co chcesz:
library(plyr)
count(mydf, "MONTH-YEAR")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 08:00:17
Używając przykładowego zestawu danych, który Ananda zmyślił, oto przykład użycia aggregate()
, który jest częścią rdzenia R. aggregate()
potrzebuje tylko czegoś, co liczy się jako funkcja różnych wartości MONTH-YEAR
. W tym przypadku użyłem VALUE
jako rzeczy do liczenia:
aggregate(cbind(count = VALUE) ~ MONTH.YEAR,
data = mydf,
FUN = function(x){NROW(x)})
Co daje..
MONTH.YEAR count
1 FEB. 2012 2
2 JAN. 2012 2
3 MAR. 2012 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 20:05:31
library(plyr)
ddply(data, .(MONTH-YEAR), nrow)
To daje odpowiedź, jeśli" miesiąc-rok " jest zmienną. Najpierw spróbuj unique (data$MONTH-YEAR) i sprawdź, czy zwraca unikalne wartości (bez duplikatów).
Następnie powyżej simple split-apply-combine zwróci to, czego szukasz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:12:24
Spróbuj użyć funkcji count w dplyr:
library(dplyr)
dat1_frame %>%
count(MONTH.YEAR)
Nie jestem pewien, skąd masz miesiąc-rok jako nazwę zmiennej. Moja wersja R nie pozwala na taką nazwę zmiennej, więc zamieniłem ją na MONTH.Roku.
Na marginesie, błędem w Twoim kodzie było to, że dat1_frame %.% group_by(MONTH-YEAR)
bez funkcji summarise
zwraca oryginalną ramkę danych bez żadnych modyfikacji. Więc chcesz użyć
dat1_frame %>%
group_by(MONTH.YEAR) %>%
summarise(count=n())
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 22:35:12
Tylko dla uzupełnienia danych.rozwiązanie tabeli:
library(data.table)
mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L),
MONTH.YEAR = c("JAN. 2012", "JAN. 2012",
"FEB. 2012", "FEB. 2012",
"MAR. 2012"),
VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)),
.Names = c("ID", "MONTH.YEAR", "VALUE"),
class = "data.frame", row.names = c(NA, -5L))
setDT(mydf)
mydf[, .(`Number of rows` = .N), by = MONTH.YEAR]
MONTH.YEAR Number of rows
1: JAN. 2012 2
2: FEB. 2012 2
3: MAR. 2012 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 13:49:02
Oto inny sposób użycia aggregate
do liczenia wierszy według grupy:
my.data <- read.table(text = '
month.year my.cov
Jan.2000 apple
Jan.2000 pear
Jan.2000 peach
Jan.2001 apple
Jan.2001 peach
Feb.2002 pear
', header = TRUE, stringsAsFactors = FALSE, na.strings = NA)
rows.per.group <- aggregate(rep(1, length(my.data$month.year)),
by=list(my.data$month.year), sum)
rows.per.group
# Group.1 x
# 1 Feb.2002 1
# 2 Jan.2000 3
# 3 Jan.2001 2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 15:26:34
Załóżmy, że mamy ramkę danych df_data jak poniżej
> df_data
ID MONTH-YEAR VALUE
1 110 JAN.2012 1000
2 111 JAN.2012 2000
3 121 FEB.2012 3000
4 131 FEB.2012 4000
5 141 MAR.2012 5000
Aby zliczyć liczbę wierszy w df_data pogrupowanych według kolumny miesiąc-rok, możesz użyć:
> summary(df_data$`MONTH-YEAR`)
FEB.2012 JAN.2012 MAR.2012
2 2 1
funkcja summary utworzy tabelę z argumentu factor, a następnie utworzy wektor dla wyniku (linia 7 i 8)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 04:09:28