问题描述
我想添加一个新列(category
),其值(a/b
)是id
列的随机样本(不替换),但以值({ A/B
列中的{1}}。
但是,当尝试这样做时,group
列中的值会发生变化-我不明白为什么会这样。
id
(如果标题和问题表达得不够清楚,请随时编辑)
解决方法
问题在于,i
用于'id'。如果数据集的row.names
为'id',那将是可行的。在这里,我们可能需要match
加上'id'
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,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",size=2,"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