2017-02-22 13 views
1

Iは、データフレームを有する:列索引付け行の値に基づいて

目的は、価格に等しい列の各行の値を選択し、新しい列数量を作成することである
DT=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5), 
      '2.0'= c(100,300,700,400,0), 
      '2.1'= c(400,200,100,500,0), 
      '2.2'= c(600,700,200,100,200), 
      '2.3'= c(300,0,300,100,100), 
      '2.4'= c(400,0,0,500,600), 
      '2.5'= c(0,200,0,800,100)) 

ように:

DT.Objective=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5), 
      '2.0'= c(100,300,700,400,0), 
      '2.1'= c(400,200,100,500,0), 
      '2.2'= c(600,700,200,100,200), 
      '2.3'= c(300,0,300,100,100), 
      '2.4'= c(400,0,0,500,600), 
      '2.5'= c(0,200,0,800,100), 
      Quantity= c(400,200,200,100,100)) 

データセットが非常に大きいので効率が重要です。私は現在使用して、より効率的にするために探して:

Names <- names(DT) 
DT$Quantity<- DT[Names][cbind(seq_len(nrow(DT)), match(DT$Price, Names))] 

何らかの理由で実際のデータに何のX. 乾杯がないのに対し、例の列名は、彼らの前に「X」が付属しています。

答えて

3

我々はsubまたはsubstringを使用して「X」プレフィックスを削除した後に、行/列のインデックスでこれを行うと、その後Xは次のように装着されている

DT$Quantity <- DT[cbind(1:nrow(DT), match(DT$Price, sub("^X", "", names(DT))))] 
DT$Quantity 
#[1] 400 200 200 100 100 

OPのポストに示したようmatchを行うことができます列名が数字で始まる場合は接頭辞。このの世話をする一つの方法は、data.frame呼び出しでcheck.names=FALSEまたはread.csv/read.table

1

@akrunが正しいか、check.names = TRUEがdata.frameのデフォルトの動作を()であるということになります。

check.names
論理:man pageから。 TRUEの場合、データフレーム内の変数の名前が構文的に有効な変数名であり、複製されていないことを確認するためにチェックされます。必要に応じてmake.namesによって調整されます。

可能であれば、列名を少しわかりやすくすることができます。

関連する問題