0

YC次のようなデータテーブルがあるとします。

Categories:           colsums:   tillTF:
ID: cat               NA         0 
  MA                  NA         0 
    spayed            NA         0
      declawed        NA         0 
        black         NA         0
          3           NA         0
            no        57         1
        claws         NA         0
          calico      NA         0
            4         NA         0
              no      42         1
           striped    NA         0
              0.5     NA         0
                yes   84         1
      not fixed       NA         0
         declawed     NA         0 
            black     NA         0 
              0.2     NA         0
                yes   19         1
              0.2     NA         0
                yes   104        1
  NH                  NA         0
    spayed            NA         0 
       claws          NA         0
          striped     NA         0
             12       NA         0 
               no     17         1
           black      NA         0
              4       NA         0
               yes    65         1
ID: DOG               NA         0 
 MA                   NA         0
...           

それは、1) 実際にはピボット テーブルではなく、ピボット テーブルのように一貫性がなくフォーマットされていること、および 2) データがはるかに複雑であり、数十年にわたって一貫して入力されていないことだけです。データに関して安全に行うことができる唯一の仮定は、各レコードに関連付けられた 12 の変数があり、常に同じ順序で入力されるということです。

私の目標は、このデータを解析して、各属性と関連する数値レコードが次のように 1 行の適切な列に収まるようにすることです。

Cat  MA  spayed    declawed  black    3    no  57
Cat  MA  spayed    claws     calico   0.5  no  42
Cat  MA  not fixed declawed  black    0.2  yes 19
Cat  MA  not fixed declawed  black    0.2  yes 104
Cat  NH  spayed    claws     striped  12   no  17
Cat  NH  spayed    claws     black    4    yes 65
Dog  MA ....

「レコード」を識別し、別の「レコード」に到達するまでデータ テーブルの列を逆方向に読み取ることで、配列に値を再書き込みする for ループを作成しました。私はRを初めて使用するので、それが可能かどうかわからないまま、理想的なループを書きました。

array<-rep(0, length(7))
    for (i in 1:7)
      if(YC$tillTF[i]==1){
        array[7]<-(YC$colsums[i])
        array[6]<-(YC$Categories[i])
        array[5]<-(YC$Categories[i-1])
        array[4]<-(YC$Categories[i-2])
        array[3]<-(YC$Categories[i-3])
        array[2]<-(YC$Categories[i-4])
        array[1]<-(YC$Categories[i-5])
      }

    YC_NT<-rbind(array)

入力したらarray、ループして、一意のレコードごとYCに新しい行を作成します。YC_NT

for (i in 8:length(YC$tillTF))
  if (YC$tillTF[i]==1){
    array[8]<-(YC$colsums[i])
    array[7]<-(YC$Categories[i])
    if (YC$tillTF[i-1]==0){
      array[6]<-YC$Categories[i-1]
            }else{ 
              rbind(array, YC_NT)}
    if (YC$tillTF[i-2]==0){
      array[5]<-YC$Categories[i-2]
          }else{
            rbind(array, YC_NT)}
    if(YC$tillTF[i-3]==0){
      array[4]<-YC$Categories[i-3]
          }else{
            rbind(array, YC_NT)}
    if(YC$tillTF[i-4]==0){
      array[3]<-YC$Categories[i-4]
          }else{
            rbind(array, YC_NT)}
    if(YC$tillTF[i-5]==0){
      array[2]<-YC$Categories[i-5]
          }else{
            rbind(array, YC_NT)}
    if(YC$tillTF[i-6]==0){
      array[1]<-YC$Categories[i-6]
          }else{
            rbind(array, YC_NT)}
}else{ 
  array<-array}

データに対して関数内でこのループを実行するとYC_NT、単一の行を含むデータ テーブルが返されます。array検索に数日を費やした後、毎回一意の名前を付けずにデータテーブルの最後の行にベクトルを追加できる R 関数があることを知りません。私の質問:

array1) と呼ばれる前の行を書き換えることなく、データテーブルの最後に呼び出されるベクトルを追加する関数はありarrayますか?

2) そのような関数が存在しない場合array、for ループが新しい数値レコードに到達するたびに新しい名前を作成するにはどうすればよいですか?

ご協力いただきありがとうございます、

4

2 に答える 2

0

rbindまたはrbind.fillでうまくいくはずです。または、次のようなコードを使用して行をより効率的に挿入できます。

df[nrow(df) + 1,] <- newrow
于 2014-06-09T14:37:44.870 に答える