Ik heb een dataframe in R
zoals dit:
ID MONTH-YEAR VALUE
110 JAN. 2012 1000
111 JAN. 2012 2000
. .
. .
121 FEB. 2012 3000
131 FEB. 2012 4000
. .
. .
Dus voor elke maand van elk jaar zijn er n
rijen en ze kunnen in elke volgorde staan (wat betekent dat ze niet allemaal in continuïteit zijn en pauzes hebben). Ik wil berekenen hoeveel rijen er zijn voor elk MONTH-YEAR
, d.w.z. hoeveel rijen er zijn voor JAN. 2012, hoeveel voor FEB. 2012 enzovoort. Zoiets als dit:
MONTH-YEAR NUMBER OF ROWS
JAN. 2012 10
FEB. 2012 13
MAR. 2012 6
APR. 2012 9
Ik heb geprobeerd dit te doen:
n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))
maar het levert niet de gewenste output op. Hoe kan ik dat doen?
Antwoord 1, autoriteit 100%
Hier is een voorbeeld dat laat zien hoe table(.)
(of, beter overeenkomend met de gewenste uitvoer, data.frame(table(.))
doet wat het klinkt zoals je vraagt.
Let ook op hoe u reproduceerbare voorbeeldgegevens kunt delen op een manier die anderen kunnen kopiëren en plakken in hun sessie.
Dit zijn de (reproduceerbare) voorbeeldgegevens:
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
Hier is de berekening van het aantal rijen per groep, in twee outputweergaveformaten:
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
Antwoord 2, autoriteit 96%
De functie count()
in plyr
doet wat je wilt:
library(plyr)
count(mydf, "MONTH-YEAR")
Antwoord 3, autoriteit 39%
Aan de hand van de voorbeelddataset die Ananda heeft verzonnen, is hier een voorbeeld met aggregate()
, dat deel uitmaakt van core R. aggregate()
heeft alleen iets nodig om te tellen als functie van de verschillende waarden van MONTH-YEAR
. In dit geval heb ik VALUE
gebruikt om te tellen:
aggregate(cbind(count = VALUE) ~ MONTH.YEAR,
data = mydf,
FUN = function(x){NROW(x)})
waardoor je…
MONTH.YEAR count
1 FEB. 2012 2
2 JAN. 2012 2
3 MAR. 2012 1
Antwoord 4, autoriteit 30%
Probeer de telfunctie in dplyr te gebruiken:
library(dplyr)
dat1_frame %>%
count(MONTH.YEAR)
Ik weet niet zeker hoe je MONTH-YEAR als variabelenaam hebt gekregen. Mijn R-versie staat zo’n variabelenaam niet toe, dus heb ik deze vervangen door MONTH.YEAR.
Als een kanttekening, de fout in je code was dat dat1_frame %.% group_by(MONTH-YEAR)
zonder een functie summarise
het originele dataframe retourneert zonder enige wijzigingen. Dus je wilt gebruiken
dat1_frame %>%
group_by(MONTH.YEAR) %>%
summarise(count=n())
Antwoord 5, autoriteit 13%
library(plyr)
ddply(data, .(MONTH-YEAR), nrow)
Dit geeft u het antwoord als “MAAND-JAAR” een variabele is.
Probeer eerst unique(data$MONTH-YEAR) en kijk of het unieke waarden retourneert (geen duplicaten).
Dan zal bovenstaande simpele split-apply-combine je opleveren wat je zoekt.
Antwoord 6, autoriteit 11%
Alleen ter aanvulling de data.table-oplossing:
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
Antwoord 7
Stel dat we een df_data dataframe hebben zoals hieronder
> 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
Tel het aantal rijen in DF_DATA gegroepeerd op kolom Maand jaar, kunt u gebruiken:
> summary(df_data$`MONTH-YEAR`)
FEB.2012 JAN.2012 MAR.2012
2 2 1
Samenvatting Functie maakt een tabel uit het factorargument en maak vervolgens een vector voor het resultaat (LINE 7 & AMP; 8)
Antwoord 8
Hier is een andere manier om aggregate
te gebruiken om rijen per groep te tellen:
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