2017-10-16 4 views
0

行列またはdfの1:n列のすべての行に2つの単純な関数を2段階で適用しようとしていますここでは、関数の入力として最後の列の値を使用します。 この質問は重複しているかもしれませんが、私が探している解決策を見つけることができません。関数、関数apply、関数dplyrの作成を試みましたが、特定の列を参照する方法と、x、yの組み合わせごとに個別の結果を得る方法がついています。1:n列と行のすべての値への入力としてデータフレーム内の列を使用する関数を適用します。

私はhow to apply a function to every row of a matrix (or a data frame) in R、ここでは[こちらの回答を見てきました:

しかし、これらの操作は、主に行または列賢明な、と私はすべての観測に作業する機能を必要としている、すなわち

これは単純化されています私のデータの例ですが、データフレームの長さは変数と長さの両方で異なります。可変深度の深度プロファイルを測定しています。

第一希望の機能:

df<- matrix(c( 
     1.11543500, 1.09273900, 1.09362300, 1.09073300, 1.09668300, 0.0876387143, 
     1.08729500, 1.06946100, 1.06227900, 1.06633600, 1.06690000, 0.0853604143, 
     1.05458300, 1.03921000, 1.03225300, 1.03782000, 1.03416200, 0.0790749429, 
     1., 1.01204520, 1.00525750, 1.00781250, 1.00666170, 0.0756004571 
    ), nrow = 4, byrow = TRUE) 

まず私のような関数を適用するワイドフォーマットでDFを持っている必要があります。 V6によってV5減算、このような出力を与える(V6を除外するために微細であろう:

df1 
     V1   V2   V3   V4   V5   V6 
1 1.027796286 1.005100286 1.005984286 1.003094286 1.009044286 0.087638714 
2 1.001934586 0.984100586 0.976918586 0.980975586 0.981539586 0.085360414 
3 0.975508057 0.960135057 0.953178057 0.958745057 0.955087057 0.079074943 
4 0.952231643 0.936444743 0.929657043 0.932212043 0.931061243 0.075600457 

を私が試みた:V1の行ごと

df1<- apply(df, 1, function(x) x[1:5]-x[6]) 

そして、それは間違っている、私にこれを与えた:?コードを修正する方法についての提案と

df1 [,1]  [,2]  [,3]  [,4] 
[1,] 1.027796 1.0019346 0.9755081 0.9522316 
[2,] 1.005100 0.9841006 0.9601351 0.9364447 
[3,] 1.005984 0.9769186 0.9531781 0.9296570 
[4,] 1.003094 0.9809756 0.9587451 0.9322120 
[5,] 1.009044 0.9815396 0.9550871 0.9310612 

誰もが私はまた、OPEています例えば、dplyrの提案や呼び出す関数のためのn

私は、最初の計算結果を転置して、温度と塩分値を含む他の列と定数を加えなければならない次のステップを続ける方法についても私に答えてくれることを願っています

x = z- [constant_t * (t1 - t2) + constant_s * S] 

ここで、zは最初の計算からの出力です。

答えて

0

これを行うには、dplyrからmutate_atを使用できます。私はncolを使用して、使用する列を特定しました。 @PoGibasが示唆するように、t()を使用して、次のステップに進むことができます。

library(dplyr) 
df <- as_tibble(df) 
df1 <- mutate_at(df, 1:(ncol(df) -1), funs(. - df[[ncol(df)]])) 
df1 
#> # A tibble: 4 x 6 
#>   V1  V2  V3  V4  V5   V6 
#>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> 
#> 1 1.0277963 1.0051003 1.0059843 1.0030943 1.0090443 0.08763871 
#> 2 1.0019346 0.9841006 0.9769186 0.9809756 0.9815396 0.08536041 
#> 3 0.9755081 0.9601351 0.9531781 0.9587451 0.9550871 0.07907494 
#> 4 0.9522316 0.9364447 0.9296570 0.9322120 0.9310612 0.07560046 

t(df1) 
#>   [,1]  [,2]  [,3]  [,4] 
#> V1 1.02779629 1.00193459 0.97550806 0.95223164 
#> V2 1.00510029 0.98410059 0.96013506 0.93644474 
#> V3 1.00598429 0.97691859 0.95317806 0.92965704 
#> V4 1.00309429 0.98097559 0.95874506 0.93221204 
#> V5 1.00904429 0.98153959 0.95508706 0.93106124 
#> V6 0.08763871 0.08536041 0.07907494 0.07560046 

あなたは結果から最後の変数をドロップすることを好む場合は、代わりにmutate_attransmute_atを使用することができます。

transmute_at(df, 1:(ncol(df) -1), funs(. - df[[ncol(df)]])) 

#> # A tibble: 4 x 5 
#>   V1  V2  V3  V4  V5 
#>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> 
#> 1 1.0277963 1.0051003 1.0059843 1.0030943 1.0090443 
#> 2 1.0019346 0.9841006 0.9769186 0.9809756 0.9815396 
#> 3 0.9755081 0.9601351 0.9531781 0.9587451 0.9550871 
#> 4 0.9522316 0.9364447 0.9296570 0.9322120 0.9310612 
+0

は@markdlyありがとうございます!それはうまく動作します!私は "。"お楽しみに!しかし、それだけでは、あなたのコード全体が助けにならないでしょう。しかし、私が@PoGibasに尋ねたように、あなたのスクリプトにはcol名を参照する方法がありますか?次のステップは5つの列を含み、より簡単で安全です!私のdfには178の変数があるので、名前で呼び出すことができます。 –

+0

とtibbleは私にとって新しいものでした!素晴らしいこと!/ありがとう –

+0

@ E.ThereseHarvey、それは助けてうれしい!上記の例で列名を使用するには、 'mutate_at(df、vars(V1:V5)、funs(。-V6))'を実行できます。また、 '?dplyr :: select_helpers'を見て、' vars() 'の中で' V1:V5'の代わりに名前を使って変数を選択する方法もあります。 – markdly

関連する問題