2016-05-03 186 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包,但不能连接上应该包括哪些内容作为第二个参数来paste点。

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

在此先感谢。我欢迎任何建议。

+1

'DAT%>%GROUP_BY(的indid,媒体)%>%突变(WantThis = paste0(媒体,ROW_NUMBER()))'大概 –

+0

'DAT2 <- dat %>%GROUP_BY(的indid,媒体)%>%变异(WantThis = paste0(Media,row_number()))''生成'错误在rank(x,ties.method =“first”,na.last =“keep”): 参数“x”丢失, –

+1

你有哪个'dplyr'版本?它对我很好。你可以尝试mutat(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 
相关问题