2017-05-07 9 views
1

私は、データフレーム(以下に簡略化されているバージョン)を持っているが返された行に関数を適用ベクトルの代わりに、リスト

b<-data.frame('v1'=1:2,'v2'=3:4,'v3'=5:6) 

私は行に適用されます使用している場合:

test<-apply(b,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)}) 

私が得た:

[,1]  [,2] 
v1 0.2 0.3333333 
v2 0.6 0.6666667 
v3 1.0 1.0000000 

これまでのところ、カラム名v1、v2、v3が必要なので、テストでは行の名前になりました。 しかし、データフレームがすべてゼロであれば0 0 私の質問は、Aの最後の場合は基本的に

[,1]  [,2] 
v1 0  0 
v2 0  0 
v3 0  0 

のようなテストリターン何かをできるようにする方法であるとして、

b1<-data.frame('v1'=c(0,0),'v2'=c(0,0),'v3'=c(0,0)) 
test<-apply(b1,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)}) 

テストは、ベクトルを返します。行が0である行のすべてを0にしたい、もっと重要なのは、戻り値がリストであれば、v1、v2、v3行の名前が返されます(戻り値があればデータフレームに変更できます)。返り値はベクトル0,0です。私はv1、v2、v3のすべての情報を失いました。なぜすべてのゼロがそのような違いをもたらすのでしょうか?

答えて

1

最後の列でデータフレームを分割し、次にNAsをゼロで置き換える関数を作成するだけではどうですか?

prop_last_col <- function(df) { 
     prop <- df/df[, ncol(df)] 
     prop[is.na(prop)] <- 0 
     return(prop) 
    } 

prop_last(b) 
     v1  v2 v3 
1 0.2000000 0.6000000 1 
2 0.3333333 0.6666667 1 


prop_last(b1) 
    v1 v2 v3 
1 0 0 0 
2 0 0 0 

例と同じ形式にしたい場合は、結果を置き換えることができます。

+0

返信ありがとうございます。それは確かに動作します。私は、最後の列がすべて0であるか、少なくとも1つがゼロでない場合にRが異なる扱いをするのかと疑問に思っています。私は誰かが私にこの問題を解決するための根本的な理由と直接的な方法を教えてくれることを願っていますので、NAをゼロに変換するために余分な手を加える必要はありません。ところで、もし私が受け入れるならば、私は複数の解決策を受け入れることができます。 – Rocky

+2

これは、行の最後の要素がゼロになるたびに0の長さ1の数値ベクトルを返すためです。値が0より大きい場合は、行に操作を戻します(名前を保持します)。最後の戻り値を 'test <-apply(b1,1、function(x){if(x [length(x)]> 0)のように' x * x)])else return(x * 0)}) 'あなたが望む結果を得るでしょう。しかし、私はそのコードを読むのが少し難しいと思う。 – Sraffa

+0

ああ、あなたは[1つの回答](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)のみ受け入れることができます。 – Sraffa

関連する問題