2017-01-24 5 views
0

Ich habe einen Datenrahmen (df) mit drei Spalten wie folgt:Bedingte Zählung in Datenrahmen

Struktur:

id id1 age 
A1 a1 32 
A1 a2 45 
A1 a3 45 
A1 a4 12 
A2 b1 15 
A2 b5 34 
A2 b64 17 

Erwartete Ausgabe:

id count count1 
A1 4  1 
A2 3  2 

Logic :

  • Spalte "count" ist die Anzahl der "id" wiederholt wird
  • Spalte "count1" ist die Anzahl der Zeilen, in denen Alter weniger als 21

Aktuelle Code:

library(dplyr) 
df_summarized <- df %>% 
        group_by(id) >%> 
        summarise(count = n(),count1 = count(age<21)) 

Problem:

Error: no applicable method for 'group_by_' applied to an object of class "logical" 

Antwort

2

Wir brauchen die sum

df %>% 
    group_by(id) %>% 
    summarise(count = n(),count1 = sum(age < 21)) 
# A tibble: 2 × 3 
#  id count count1 
# <chr> <int> <int> 
#1 A1  4  1 
#2 A2  3  2 

als count gilt für data.frame oder tbl_df und nicht in einer einzigen Spalte in der summarise


Oder mit data.table

library(data.table) 
setDT(df)[, .(count = .N, count1 = sum(age < 21)), id] 

zu tun

Oder mit base R

cbind(count = rowSums(table(df[-2])), count1 = as.vector(rowsum(+(df$age < 21), df$id))) 
# count count1 
#A1  4  1 
#A2  3  2 

Oder mit aggregate basierend auf dem sum

do.call(data.frame, aggregate(age~id, df, FUN = 
      function(x) c(count = length(x), count1 = sum(x<21)))) 

HINWEIS: Alle oben genannten Methoden geben den Datensatz mit der richtigen Spalten. Dies wird besonders in aggregate zur Kenntnis genommen. Das ist der Grund, warum die Ausgabespalt dh eine Matrix, um die ordnungsgemäßen Säulen mit do.call(data.frame

4

Mit Basis R umgewandelt werden, können wir aggregate verwenden Anzahl von Zeilen für jede Gruppe zu finden (id) sowie Anzahl der Zeilen mit dem Wert von weniger als 21

aggregate(age~id, df, function(x) c(count = length(x), 
                count1 = length(x[x < 21]))) 

# id age.count age.count1 
#1 A1   4   1 
#2 A2   3   2 
Verwandte Themen