【问题标题】:Adding a new column to data.frame whose values are random samples of one column and conditioned on another向 data.frame 添加一个新列,其值是一列的随机样本并以另一列为条件
【发布时间】:2020-09-15 16:51:11
【问题描述】:

我想添加一个新列 (category),其值 (a/b) 是 id 列的随机样本(无需替换),但以 @ 中的值 (A/B) 为条件987654325@-列。 但是,当尝试这样做时,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

(如果表达不够清楚,请随时编辑标题和问题)

【问题讨论】:

    标签: r dataframe random sample mismatch


    【解决方案1】:

    问题在于,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, 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
    

    【讨论】:

    • 呃,我不知道with()这个函数,它看起来不错的代码。
    【解决方案2】:

    这很奇怪,但是当我通过在子集函数中包含“类别”的名称来替换 $ 运算符时,它就起作用了。像这样:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多