我想添加一个新列(category
(,其值(a/b
(是id
-列的随机样本(不替换(,但以group
-列中的值(A/B
(为条件。然而,当尝试这样做时,id
列中的值发生了变化——我不明白为什么会发生这种情况。
set.seed(123)
df <- data.frame(id=LETTERS[1:10], group=sample(c("1","2"), size=10, replace=T))
df$category <- NA
> table(df$group)
1 2
6 4
df[df$id %in% sample(df[df$group=="1",]$id, size=4, replace=F),]$category <- "a"
df[df$id %in% sample(df[df$group=="2",]$id, size=2, replace=F),]$category <- "b"
> df
id group category
1 A 1 a
2 B 1 <NA>
3 B 1 a
4 D 2 b
5 E 1 <NA>
6 F 2 <NA>
7 G 2 <NA>
8 H 2 b
9 C 1 a
10 E 1 a
> df$id==LETTERS[1:10]
[1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
# this should be all TRUE
(如果标题和问题表达得不够清楚,请随时编辑(
问题是,i
用于"id"。如果数据集的row.names
是"id",它就会起作用。在这里,我们可能需要使用"id"的match
i1 <- with(df, match(sample(id[group == 1], size = 4, replace = FALSE), id))
df$category[i1] <- 'a'
类似地,对于第二种情况
i2 <- with(df, match(sample(id[group == 2], size = 2, replace = FALSE), id))
df$category[i2] <- 'b'
-输出
df
# id group category
#1 A 1 a
#2 B 1 <NA>
#3 C 1 a
#4 D 2 b
#5 E 1 a
#6 F 2 <NA>
#7 G 2 b
#8 H 2 <NA>
#9 I 1 <NA>
#10 J 1 a
df$id==LETTERS[1:10]
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
这很奇怪,但当我替换$运算符时,它起了作用,包括了"类别";在子设置函数内部。像这样:
set.seed(123)
df <- data.frame(id=LETTERS[1:10], group=sample(c("1","2"), size=10, replace=T))
df$category <- NA
df[df$id %in% sample(df[df$group=="1",]$id, size=4, replace=F), "category"] <- "a"
df[df$id %in% sample(df[df$group=="2",]$id, size=2, replace=F), "category"] <- "b"
结果:
id group category
1 A 1 a
2 B 1 <NA>
3 C 1 a
4 D 2 <NA>
5 E 1 <NA>
6 F 2 <NA>
7 G 2 b
8 H 2 b
9 I 1 a
10 J 1 a
df$id==LETTERS[1:10]
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE