Ich arbeite an einem großen Datensatz, ich, was zu zählen, wie viel Zeit zwei Spalten die gleichen Werte haben. Hier ist ein Beispiel des Datensatzes:Alternative verschachtelte für Schleifen zum Zählen von Wert Auftreten in R Datenrahmen
id = rep(replicate(4, paste(sample(LETTERS, 3, replace=F), collapse="")), 12500)
names = rep(replicate(3125, paste(sample(letters, 5, replace=T), collapse="")), 16)
times = sample(c(3,6,24), 50000, replace = T)
df = data.frame(id=id, names=names, times=times)
count <- list()
ids <- as.vector(unique(df$id))
nms <- as.vector(unique(df$names))
for(i in 1:length(ids)){
vec <- c()
for(j in 1:length(nms)){
vec[j] <- nrow(df[df$id == ids[i] & df$names == nms[j], ])
}
count[[i]] <- vec
}
Meine reale Daten über 50000 x 10
Dimension und die ID und Name Felder sind zufällig verstreut. Kann jemand einen besseren Weg vorschlagen, damit umzugehen? weil mein Ansatz funktioniert, aber zu langsam. dplyr
oder plyr
Methoden?
Danke,
EDIT:
kurze Version meines Datenrahmen:
id = rep(replicate(3, paste(sample(LETTERS, 3, replace=F), collapse="")), 5)
names = rep(replicate(3, paste(sample(letters, 5, replace=T), collapse="")), 5)
times = sample(c(3,6,24), 15, replace = T)
df = data.frame(id=id, names=names, times=times)
df
id names times
1 DEW xxsre 24
2 QHY xkbhr 24
3 DQE tuyfk 6
4 DEW xxsre 24
5 QHY xkbhr 24
6 DQE tuyfk 3
7 DEW xxsre 3
8 QHY xkbhr 24
9 DQE tuyfk 3
10 DEW xxsre 24
11 QHY xkbhr 24
12 DQE tuyfk 3
13 DEW xxsre 24
14 QHY xkbhr 3
15 DQE tuyfk 3
Ausgang:
> count
[[1]]
[1] 5 0 0
[[2]]
[1] 0 5 0
[[3]]
[1] 0 0 5
jedes Listenelement für id ist, und die Liste Vec ist für Namen zählen. mit anderen Worten as.vector(unique(df$id))
bzw. as.vector(unique(df$names))
.
I don nicht sehen, wie die Spalten "id", "names" und "times" einander immer gleich sind. Wo definierst du deinen _original_ Datenrahmen? –
Ich dachte "mal" war die Spalte, die OP erstellen möchte und es einfach in das Beispiel als erwartete Ausgabe aufgenommen hat. (?) ... Weiß nicht ... – Sotos
Ich habe versucht, es mit einer kleineren Größe auszuführen 'df' (500 Zeilen), aber die resultierende Anzahl ist nur eine Liste von 4, jede besteht aus 125 Einsen. – zyurnaidi