2016-05-03 2 views
1

У меня есть воспроизводимый df, где есть повторные пробы от человека. Для каждого образца я отслеживаю заказ, который были взяты сэмплами, и носителем (A или B).Создание новой колонки на основе двух столбцов в кадре данных

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 

Я хочу сделать новый столбец, который содержит СМИ и число, которое означает орден выборки в пределах каждого уровня средств массовой информации. Говоря иначе, группируя IndID и Media, я хочу создать новый столбец, который заказывает образцы. Для каждого человека, если в двух разных носителях (например, IndID 1) есть только два образца, новое значение будет «A1» и «B1». Если есть два образца из одного и того же носителя, новые значения должны быть «B1» и «B2» в порядке, следующем за порядком выборки.

С учетом приведенных выше данных, я пытаюсь создать следующий столбец

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 

Я пытался использовать dplyr пакет, но не можете соединить точки, что должно быть включено в качестве 2-го аргумента paste.

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

Заранее спасибо. Я приветствую любые предложения.

+1

'Даты%>% group_by (IndID, СМИ)%>% мутирует (WantThis = paste0 (СМИ, row_number()))', вероятно, –

+0

'dat2 <- dat %>% group_by (IndID, СМИ)%>% мутирует (WantThis = paste0 (Media, row_number())) генерирует ошибку в ранге (x, ties.method = "first", na.last = "keep"): аргумент "x" отсутствует, без значения по умолчанию –

+1

Какая версия 'dplyr' у вас есть? Он отлично работает против меня. Вы можете попробовать 'mutate (WantThis = paste0 (Media, 1: n())) вместо этого может быть –

ответ

2

Если вы используете номер строки группировки, он должен получить то, что вы хотите.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^