簡體   English   中英

向 data.frame 添加一個新列,其值是一列的隨機樣本並以另一列為條件

[英]Adding a new column to data.frame whose values are random samples of one column and conditioned on another

我想添加一個新列( 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”,它會起作用。 在這里,我們可能需要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

這很奇怪,但是當我替換 $ 運算符時它起作用了,方法是在子集函數中包含“類別”的名稱。 像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM