ホーム>source

ベクターのコンテンツをデータフレームに追加したいと思います。たとえば、次のようなベクターがあります。

1, 2, 1, 1, 2, 4

そして、次のようなデータフレーム:

Name1 Name2 Name3 Name4 Name5 Name6
    3     2     2     0     3     1

そして、ベクターに表示される数字をカウントし、そのデータをdeデータフレームの列インデックスに追加したいので、この例では次のようなデータフレームを取得します。

Name1 Name2 Name3 Name4 Name5 Name6
    6     4     2     1     3     1

ベクトルには3つの1、2、2、1つの4があるためです。

私は十分に明確であったかどうかはわかりませんが、ありがとう!

あなたの答え
  • 解決した方法 # 1

    df + replace(vec, 1:6, tabulate(vec, 6))
      Name1 Name2 Name3 Name4 Name5 Name6
    1     6     4     2     1     3     1
    
    

    より一般的な鉱石、いくつかの説明:

    df + replace(vec, 1:dim(df)[2], tabulate(vec, dim(df)[2]))
        #replace values in vec
        #list of values to be replaced: 1:6 (since you have 6 columns)
        #replaced by the occurence of each value in vec (using tabulate with nbins ensures each value between 1 and 6 is in the replacement list, with zeroes for 3, 5 and 6)   
        #finally, add it to df
    
    

    データ:

    vec <- c(1, 2, 1, 1, 2, 4)
    df <- read.table(text = "
                     Name1 Name2 Name3 Name4 Name5 Name6
        3     2     2     0     3     1", h = T)
    
    

  • 解決した方法 # 2

    列名が質問で述べたとおりである場合、次のようなものです。

    tb <- table(vec)
    cols <- paste0("Name", names(tb))
    df[cols] <- df[cols] + tb
    
    

    ここで、 vec  あなたのベクトルと df  データフレーム。

    列名は重要ではなく、列のインデックスが cols を置き換える場合  と

    cols <- as.numeric(names(tb))
    
    

  • 解決した方法 # 3

    Because there are three 1, two 2, and one 4 in the vector.

    ベクトルを、レベルが1からデータの列数に達する因子に変換できます。次に、 table を使用します  出現回数をカウントし、データフレームに追加します。

    df + table(factor(vec, levels = 1:ncol(df)))
    #  Name1 Name2 Name3 Name4 Name5 Name6
    #1     6     4     2     1     3     1
    
    

    データ

    df <- structure(list(Name1 = 3L, Name2 = 2L, Name3 = 2L, Name4 = 0L, 
        Name5 = 3L, Name6 = 1L), .Names = c("Name1", "Name2", "Name3", 
    "Name4", "Name5", "Name6"), class = "data.frame", row.names = c(NA, 
    -1L))
    vec <- c(1, 2, 1, 1, 2, 4)
    
    

  • 解決した方法 # 4

    ほとんどの場合、同じことを行う関数があります。ただし、このコードは役に立つかもしれません。

    ベクトルとデータフレームのテストセット、

    o<-data.frame(round(runif(5,min = 1,max = 5 )))
    q<-round(runif(5,min = 1,max = 5))
    
    

    そして、ベクトルセット内の数値をカウントし、データフレームセットの値をカウントされた数値に追加するループがあります。

    for (i in 1:dim(o)[1]){
      j=1
      while (j<=dim(o)[1]) {
      if(i==q[j]){o[i,1]<-o[i,1]+1}
        j<-j+1
      }}
    
    

  • 解決した方法 # 5

    loop を使用できます 。内部使用 which  一致と length を識別する  発生回数をカウントします。

    a <- NULL
    for(i in 1:length(v)){
      a <- c(a,length(which(v==i)))
    }
    df+a
      Name1 Name2 Name3 Name4 Name5 Name6
    1     6     4     2     1     3     1
    
    

    このようにデータを読み取ります。

    v <- c(1, 2, 1, 1, 2, 4)
    df <- read.table(text="
    Name1 Name2 Name3 Name4 Name5 Name6
        3     2     2     0     3     1", header=T)    
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ reactjs - React Typescript destructure providerValue