2016-03-22 14 views
0

Rを使用してデータフレームに新しい列を生成するためのコードを単純化しようとしています。私のデータはこのようなもの(1-4列目)で構成されています。Rを使用して列を追加するR

col1__col2__col3__col4______ 
t1 f1 A 20  0 
t1 f2 A 19  0 
t1 f3 A 21  0 
t1 f1 B 25  5 
t1 f2 B 25  6 
t1 f3 B 26  5 
t2 f1 A 18  0 
t2 f2 A 19  0 
t2 f3 A 18  0 
t2 f1 B 20  2 
t2 f2 B 20  1 
t2 f3 B 20  2 

EDIT:列5は次のようになります(等式)。これは、col1からt1、f1の値をとり、t1、f1からcol3 = "A"を減算します。したがって、行1では20になり、それと同じ20が減算されます。行4の場合、行t1からのサンプルf1を参照するため、行1の20を減算します。 2つの異なるもの(AとB)の値。だから、上記のように見つかった列5はthusly計算されます。

col5 
(20-20) 
(19-19) 
(21-21) 
(25-20) 
(25-19) 
(26-21) 
etc... 

は、列がいいと簡単です追加が、私はこれらすべての条件に構築するための良い方法を見つけるの問題を抱えています。誰かがこれをコード化する方法や、データを整理してより簡単にする方法について提案があれば、とても感謝しています。これまでのところ私は手動でMS Excelの列5の値を生成してきた:回答:

乾杯

EDIT2 \。返事をしたすべての人におかげでありがとう!

+0

これは実際には複雑です。 col3 == "A" "col3 ==" A "には6つの値があります。あなたはこれらの6つの平均を指していますか?この線で正確に何を意味しているのですか? – Marsenau

+0

ごめんなさい。ちょっと混乱している場合は、質問を書き直してみます。フィードバックをお寄せいただきありがとうございます。 私は、治療t1内のf1 Bからf1 Aを差し引いた値に興味があると言っています。出力列の式は、処理t1内でf1A-f1 Aを取る可能性もありますが、これはちょうどゼロになります。私は技術的にはこの値は必要ありませんが、それがあればうまくいきます。そして、おそらくコードが適切に機能していることを確認するための良い検証ステップです。 – Crawdaunt

答えて

1
df = df[order(df$col1,df$col3,df$col2),]   ## make sure you have it ordered right 
flength = length(unique(df$col2))   ## get the length of unique col2 
alength = length(unique(df$col3))   ## get the length of unique col3 
Avector = df[df$col3=="A","col4"]    ## get the elements of col 4 with col3="A" 
sapplyVec = (1:alength) - 1     ## create vector to sapply over 

## take the elements in Avector in sections of size flength and repeat those 
## section alength times. 
Avector = c(sapply(sapplyVec ,function(x) rep(Avector[c(1:flength)+(x*flength)],alength))) 

これはcol3から作成されたベクトルを取ります。ここでcol3 = "A"です。次に、サイズflength(あなたの場合は3)、長さ(あなたの場合は2)のチャンクを繰り返します。ここからは、COL4として新しいcolumsを追加することができます - Avector

のdf $ COL5 = DFます$ COL4 - Avector

+0

返信ありがとうございます!明確化も!素晴らしいよ、ありがとう! – Crawdaunt

1

col3 == "B"の場合は、一致する行をcol3 == "A"とし、対応する値をcol4から引きますか?オリジナルのポストで

for(i in 1:dim(df)[1] { 
    if(df[i, 3] == "B") { 
    df[i, 5] <- df[i, 4] - df[which(df[1:(i-1), 1] == df[i, 1] & df[1:(i-1),2] == df[i, 2] & df[1:(i-1),3] == "A"), 4] 
    } 
} 

固定タイプミス:次に、あなたはこのような何か(あなたのデータフレームがdfと呼ばれていると仮定)が必要です。

+0

このサンプルデータフレームを使って...私はオブジェクトiを定義するように頼んでいると思いますか? (df [i、3] == "0"の場合、予期せぬ「{」が「dim {df} df [1、(i-1)、1] == df [i、1]&df [1: 4] +} '[.data.frame(i-1)、2] == df [i、2]&df [1:(i-1)、3] ==" '(df、i、3):オブジェクト' i 'が見つかりません >} エラー:予期せぬ「}」の「}」 – Crawdaunt

0

user2864849のシステムは、私の実際のデータに適用しようとすると、この例のデータフレームのために働いていたが、それは創傷列5の2倍の値を出力する必要があります。私は理由を理解できませんでしたが、それはサプリ機能をどのように扱ったかと関係していました。問題を再訪したところ、ソートされたデータの新しいベクトルを生成するためのuser286のコードを思い出させる、非常にシンプルな、より長時間のコーディング・ソリューションがありました。

カラム3の各サブセットについて、カラム4の値のベクトルを生成しました。次に、生成されたベクトルのオーダーと同じ形式で出力されるようにデータフレームをソートしました。次に、これらの個々のベクトルを結合して列5を生成する新しいベクトルを作成しました。最後に、ソートされたデータフレームに列5を追加しました。

#Define variables - optional 
col1<-as.factor(df$col1) 
col2<-as.factor(df$col2) 
col3<-as.factor(df$col3) 
col4<-df$col4 

## Create vectors of Cq values for each gene 
col3Avec = df[col3=="A","col4"] 
col3Bvec = df[col3=="B","col4"] 

#Create vectors of dCq values of each gene 
col5A<-col3Avec-col3Avec 
Col5B<-col3Bvec-col3Avec 

#Sort dataframe so its order matches the order of the dCq vectors 
dfsort <- df[order(col3,col1,col2),] 

#Add dCq vectors in correct order as new column to sorted dataframe 
dfsort$col5<-c(col5A,col5B) 

#Total = 6 lines of codes not including variable definitions 

サンプルの長さが同じでもなくても、このアプローチはうまくいくと思います。多くのコードのように見えますが、このコードを適用しているデータですべての変数の名前が一貫している場合は、それを適用するために最低限必要な記録があります。

関連する問題