2017-07-10 3 views
1

(Weitere Fragen & elsewhere auf diesem Forum Antworten scheinen nicht mit dem grenzüberschreitenden Problem in diesem Feed erwähnt zu behandeln)R - finden durchschnittliche Projektmitglieder innerhalb und zwischen den Staaten

Angenommen, ich habe die folgenden Daten:

df <- data.frame(id=c("Eric", "John", "Sarah", "Simon", "Abdul", "Charlotte", "Alex", "Susan"), 
      state=c("CA", "AK", "NY", "NY", "NJ", "GA", "CA", "CA"), 
      project=c(1, 2, 2, 2, 3, 4, 5, 5), stringsAsFactors = F) 

> df 
     id state project 
1  Eric CA  1 
2  John AK  2 
3  Sarah NY  2 
4  Simon NY  2 
5  Abdul NJ  3 
6 Charlotte GA  4 
7  Alex CA  5 
8  Susan CA  5 

Ich möchte die durchschnittliche Anzahl der Projektmitglieder pro Staat, auch grenzüberschreitende Mitglieder zählen.

Um die durchschnittlich nur in-state-Mitglieder zu erhalten, habe ich folgendes:

dfx <- data.frame() 
dfy <- data.frame() 
for(j in unique(df$state)){ 
    h <- subset(df, state==j) 
    counts <- plyr::count(h, 'project') 
    #uniques <- length(unique(sub$invje)) 
    average_members <- mean(counts$freq) 
    dfx <- data.frame(state=j, 
       average_members=average_members) 
    dfy <- rbind(dfy, dfx) 
} 

> dfy 
    state average_members 
1 CA    1.5 
2 AK    1.0 
3 NY    2.0 
4 NJ    1.0 
5 GA    1.0 

Das nach, ich bin gewünschte Ausgabe sowohl AK und NY sollte 3 punkten, da jede ID mit zwei anderen IDs arbeitet an einem Projekt (trotz Leben in einem anderen Staat).

> desired 
    state average_members 
1 CA    1.5 
2 AK    3.0 
3 NY    3.0 
4 NJ    1.0 
5 GA    1.0 

Kann jemand das programmieren?

+0

Können Sie nach Ihren Wunsch Ausgabe erhalten? woher kommt auch "zählt"? – Wen

+0

@Wen 'counts $ freq' kommt von' counts' generiert durch 'plyr :: count (h, 'project')' –

+0

Mögliches Duplikat von [Mehrere Variablen zusammenfassen/zusammenfassen (zB Summe, Mittelwert, etc)] (https://stackoverflow.com/questions/9723208/aggregate-summarize-multiple-variables-per-group-ie-sum-mean-etc) – Kristofersen

Antwort

2

Sie können dies mit der dplyr Bibliothek. Sie können Ihre innerhalb Zustand nur noch die Frage mit

library(dplyr) 
df %>% count(state, project) %>% 
    group_by(state) %>% summarize(avg=mean(n)) 
# state  avg 
# 1 AK  1.0 
# 2 CA  1.5 
# 3 GA  1.0 
# 4 NJ  1.0 
# 5 NY  2.0 

beantworten Und Sie können Ihren across-Zustand Ergebnis mit

df %>% distinct(project, state) %>% 
    inner_join(df %>% count(project)) %>% 
    group_by(state) %>% summarize(avg=mean(n)) 

# state  avg 
# 1 AK  3.0 
# 2 CA  1.5 
# 3 GA  1.0 
# 4 NJ  1.0 
# 5 NY  3.0 
3
library(data.table) 

setDT(df) 
df[, .(num_proj = .N), by = .(state, project)][, .(average_members = mean(num_proj)), by = state] 

Ergebnis:

state average_members 
1: CA    1.5 
2: AK    1.0 
3: NY    2.0 
4: NJ    1.0 
5: GA    1.0 

Für den zweiten Fall, ziehen Sie die state aus der Gruppe von in der ersten Iteration.

unique(df[, .(state, num_proj = .N), by = project])[, .(average_members = mean(num_proj)), by = state] 

1: CA    1.5 
2: AK    3.0 
3: NY    3.0 
4: NJ    1.0 
5: GA    1.0 
1
df <- data.frame(id=c("Eric", "John", "Sarah", "Simon", "Abdul", "Charlotte", "Alex", "Susan"), 
       state=c("CA", "AK", "NY", "NY", "NJ", "GA", "CA", "CA"), 
       project=c(1, 2, 2, 2, 3, 4, 5, 5), stringsAsFactors = F) 


dfx <- data.frame() 
dfy <- data.frame() 

for (j in unique(df$state)) { 
    h = subset(df, state==j) 
    thisStatesProjects = unique(h[,"project"]) 
    h2 = subset(df, project %in% thisStatesProjects) 
    average_members = nrow(h2)/length(thisStatesProjects) 
    dfx <- data.frame(state=j, 
         average_members=average_members) 
    dfy <- rbind(dfy, dfx) 

} 
Verwandte Themen