基于数据框中的两列创建新列
Creating a new column based on two columns in a data frame
我有一个可重现的 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, ???? )))
提前致谢。我欢迎任何建议。
如果您使用分组的行号,它应该可以满足您的需求。
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
我有一个可重现的 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, ???? )))
提前致谢。我欢迎任何建议。
如果您使用分组的行号,它应该可以满足您的需求。
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