bugfix> r > 投稿

サブセットを抽出し、クラスをランダムに再割り当てしてデータフレームに戻すデータセット(Nの2794)があります。

| Index | B | C | Class|
| 1     | 3 | 4 | Dog  |
| 2     | 1 | 9 | Cat  |
| 3     | 9 | 1 | Dog  |
| 4     | 1 | 1 | Cat  |

上記の例から、列 'Class'からN個の観測値をランダムに取得し、これらを混合して、次のような結果を得たいと思います。

| Index | B | C | Class|
| 1     | 3 | 4 | Cat  | Re-sampled 
| 2     | 1 | 9 | Dog  | Re-sampled 
| 3     | 9 | 1 | Dog  |
| 4     | 1 | 1 | Dog  | Re-sampled

このコードはランダムに抜粋 行を再サンプリングしますが、行を抽出したくありません。それらをデータフレームに保持したい。

sample(Class[sample(nrow(Class),N),]) 

回答 4 件
  • df と仮定します  あなたのデータフレームです:

    df <- data.frame(index=1:4, B=c(3,1,9,1), C=c(4,9,1,1), Class=c("Dog", "Cat", "Dog", "Cat"))
    
    

    これはあなたが望むことをしますか?

    dfSamp <- sample(1:nrow(df), N)
    df$Class[dfSamp] <- sample(df$Class[dfSamp])
    
    

  • データフレームをシミュレートし、例を実行しました。

    df <- data.frame(
      ID=1:4,
      Class=c('Dog', 'Cat', 'Dog', 'Cat')
    )
    N <- 2
    sample_ids <- sample(nrow(df), N)
    df$Class[sample_ids] <- sample(df$Class, length(sample_ids))
    
    

  • Class を想定  datafameの命名方法は次のとおりです。

    library(dplyr)
    bind_rows(
      Class %>% 
        mutate(origin = 'not_sampled'),
      Class %>% 
        sample(100, replace = TRUE) %>% 
        mutate(origin = 'sampled'))
    
    

    元のデータフレームの100個の観測値をサンプリングし、その最下部にスタックします。また、観測値がサンプリングされたのか、最初からデータフレームに存在したのかを確認できるように、列を追加しています。

  • あなたがしたいことは、いくつかのクラスをインラインで置き換えますが、他のクラスは置き換えません。

    したがって、データフレームから始めると、 df

    set.seed(100)
    df = data.frame(index = 1:100,
                    B = sample(1:10,100,replace = T),
                    C = sample(1:10,100,replace = T),
                    Class = sample(c('Cat','Dog','Bunny'),100,replace = T))
    
    

    そして、5つのランダムな行を更新したい場合、更新する行とそれらの行に入れる新しいクラスを選択する必要があります。 unique(df$class) を参照することにより  現在の発生によってクラスに重みを付けません。これは weight で調整できます  引数または削除 unique  オカレンスを重みとして使用します。

    n_rows = 5
    rows_to_update = sample(1:100,n_rows,replace = F)
    new_classes = sample(unique(df$Class),n_rows,replace = T)
    rows_to_update
    #> [1] 85 65 94 60 48
    new_classes
    #> [1] "Bunny" "Dog"   "Dog"   "Dog"   "Bunny"
    
    

    元のデータがどのように見えたかを調べることができます

    df[rows_to_update,]
    #>    index B  C Class
    #> 85    85 1  2   Dog
    #> 65    65 5  1 Bunny
    #> 94    94 5 10   Dog
    #> 60    60 3  7 Bunny
    #> 48    48 9  1   Cat
    
    

    更新する列と行への参照を使用して、これを適切に更新できます。

    df$Class[rows_to_update] = new_classes
    df[rows_to_update,]
    #>    index B  C Class
    #> 85    85 1  2 Bunny
    #> 65    65 5  1   Dog
    #> 94    94 5 10   Dog
    #> 60    60 3  7   Dog
    #> 48    48 9  1 Bunny
    
    

あなたの答え