r-向data.frame添加一个新列,其值是一列的随机样本,并以另一列为条件



我想添加一个新列(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

相关内容

  • 没有找到相关文章

最新更新