2016-05-03 4 views
1

Ich habe eine reproduzierbare df wo gibt es Wiederholungsbemusterungen von einer Person. Für jede Probe verfolge ich die Reihenfolge, in der die Proben entnommen und die Medien verwendet wurden (A oder B).Erstellen einer neuen Spalte basierend auf zwei Spalten in einem Datenrahmen

dat <- data.frame(IndID = factor(c(1,1,2,2,2,3,3)), 
      Order = c(1,2,1,2,3,1,2), 
      Media = factor(c("A", "B", "B","A","B","A", "A"))) 
dat 
    IndID Order Media 
1  1  1  A 
2  1  2  B 
3  2  1  B 
4  2  2  A 
5  2  3  B 
6  3  1  A 
7  3  2  A 

Ich möchte eine neue Spalte machen, die die Medien und eine Zahl enthält, die in jeder Ebene der Medien die Sampling-Auftrag bedeutet. Sagt anders, Gruppierung von IndID und Media, ich möchte eine neue Spalte machen, die die Proben bestellt. Wenn es nur zwei Samples in zwei unterschiedlichen Medien gibt (wie IndID 1), wäre der neue Wert für jede Person "A1" und "B1". Wenn zwei Samples von demselben Medium stammen, müssen die neuen Werte "B1" und "B2" in einer Reihenfolge sein, die der Sampling-Reihenfolge folgt.

die oben genannten Daten eingewilligt, Ich versuche, die folgende Spalte erstellen

dat$WantThis <- c("A1", "B1","B1", "A1","B2", "A1", "A2") 

    IndID Order Media WantThis 
1  1  1  A  A1 
2  1  2  B  B1 
3  2  1  B  B1 
4  2  2  A  A1 
5  2  3  B  B2 
6  3  1  A  A1 
7  3  2  A  A2 

Ich habe das dplyr Paket zu verwenden versucht, aber die Punkte auf keine Verbindung herstellen kann, was als das zweite Argument paste einbezogen werden.

dat2 <- as.data.frame(dat %>% group_by(IndID, Media) %>% mutate(MediaOrder = paste0(Media, ????))) 

Vielen Dank im Voraus. Ich freue mich über Vorschläge.

+1

'dat%>% group_by (indid, Medien)%>% mutieren (WantThis = paste0 (Medien, row_number()))' wahrscheinlich –

+0

'dat2 <- dat %>% group_by (indid, Medien)%>% mutieren (WantThis = paste0 (Media, row_number())) 'generiert' Fehler im Rang (x, ties.method = "first", na.last = "keep"): Argument "x" fehlt, ohne Default' –

+1

Welche 'dplyr' Version hast du? Es funktioniert gut, Feind mir. Sie könnten versuchen muate (WantThis = paste0 (Media, 1: n())) 'anstelle vielleicht –

Antwort

2

Wenn Sie die Zeilennummer der Gruppierung verwenden, sollte Sie erhalten, was Sie wollen.

library(dplyr) 

dat <- data.frame(IndID = factor(c(1,1,2,2,2,3,3)), 
        Order = c(1,2,1,2,3,1,2), 
        Media = factor(c("A", "B", "B","A","B","A", "A"))) 

res <- dat %>% 
    group_by(IndID, Media) %>% 
    mutate(count = row_number(), 
     WantThis = paste(Media,count,sep="")) 

#Source: local data frame [7 x 5] 
#Groups: IndID, Media [5] 
# 
# IndID Order Media count WantThis 
# (fctr) (dbl) (fctr) (int) (chr) 
#1  1  1  A  1  A1 
#2  1  2  B  1  B1 
#3  2  1  B  1  B1 
#4  2  2  A  1  A1 
#5  2  3  B  2  B2 
#6  3  1  A  1  A1 
#7  3  2  A  2  A2