2017-11-06 17 views
-1

私はこの形式で出力を定期的に取得し、Excelで1つ1つコピー&ペーストする必要があるため、スクリプトを活用するような方法でコードを作成しようとしています雑用。しかし、私はそれが機能を実装することになると固執しています。関数を実装するのに手助けが必要ですR

だから、私のデータは次の形式である:

Condition Sample1 Sample2 .... Sample n 
T1  6.99 5.80 .... n_1  
T2  2.05 3.04 .... n_1  
T3  4.50 4.69 .... n_1  
T4  4.71 5.22 .... n_1  
T5  5.66 3.65 .... n_1  
T6  9.76 2.89 .... n_1  

私は、次の式に適用する必要があります。Equation、xは、個々のエントリで、nは係数で、完全な方程式が何かに見えるようこのように:

Example

基本的には、各要素を順番に考え、逐次係数(1:length条件からの奇数)を掛けて、答えをSとする必要があります。私のデータセットのサイズは変更されません。それは常にT1:T6になります。変更されるのはサンプル1 ... nです。理想的にはSの値が列の末尾に追加されるか、属しているサンプルを参照して別のデータセットに保存されることが理想的です。

私は転置を含むいくつかの解決策を試しましたが、私の周りに頭を包んでいるように見えません。

現在、データセットの一部でより単純な関数を実装しようとする私の試みは成功しませんでした。

適切なソリューションには*適用されていると思いますが、正しく使用する方法は完全にわかりません。

EDIT:再現可能な例を追加:

N Condition Sample A Sample B Sample C Sample D 

1 T1   91.323  78.758  70.298  66.765 
3 T2   -3.737  -1.5  -7.744  -9.247 
5 T3   5.205  4.533  2.284  2.178 
7 T4   -0.486  -0.068  -1.386  -0.927 
9 T5   0.337  -0.139  0.087  0.055 
    S  -0.046296296 -0.123654391 0.394039047 0.445258425 
+1

あなたが適切[再現性の例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を提供する場合、それはあなたを助けるために簡単です可能なソリューションをテストして検証することができるように、サンプル入力をRにコピーして貼り付けることができます。(:T5はなく、T6が、同じ原理が適用さT1を使用して):Excelでの過去の反復から再現例えば – MrFlick

+0

一部のデータ 乗算\t条件\tサンプル\tサンプルB \tサンプルC \tサンプルD T1 \t 91.323 78.758 \t \t 70.298 66.765 \t T2 \t -3.737 \t -1.5 \t -7.744 -9.247 \t T3 \t 5.205 \t 4.533 \t 2.284 \t 2.178 T4 \t -0.486 -0.068 \t \t -1.386 -0.927 \t T5 \t 0.337 \t -0.139 \t 0.087 \t 0.055 \t S \t -0.046296296 \t -0.123654391 \t 0.394039047 \t 0.445258425 – zirconium

答えて

0

あなたが何をしたいのか、これをしていますか?

per_row <- function(row){ 
    l <- length(row) 
    exp <- 2*(1:l)-1 # all the exponents 
    each <- row*(-1)^exp # compute all of these at once 
    return(sum(each)) # return sum 
} 

#some sample data 
datafr <- data.frame(a = sample(1:6), b = 1:6) 

#apply per column 
apply(datafr, 2, per_row) 
+0

>行のエラー* (-1)^ exp:2進演算子に対する非数値引数。列1の場合、答えは-1.62、列2の場合は0.645です。私が間違っていることを確認していない[edit2:この答えは、n_odd = 1 - > 11のsum [n(x)]という形の簡単な操作であるxはエントリ – zirconium

+0

です。 MATLABでは、それを考えるようになります - それは列ベクトル演算です。理想的には私はRでそれを解決しますが、MATLABは現時点では容易に入手できません。 – zirconium

+0

最初:n_oddの 'exp'のベクトルを呼び出すのは私にとっては賢明ではありませんでした。これはすでに関数名であるためです。 2番目:バニラの 'R'セッションに上記のコードをコピーすると、エラーやエラーが発生しません。しかし、あなたの 'dT'では、最初の列が非数値なので、' apply(dT [、2:5)、2、per_row] 'がその仕事をしなければなりません。私はまだ結果をチェックしていない。 – Bernhard

0

この内容はどうですか?あなたが持っているSampleN列の数には無関心でなければなりません。 6つの奇数乗算器を使用する6条件ケースに対して特別に設計されていることに注意してください。ただし、それは変更されないので、問題はないはずです。


suppressPackageStartupMessages(library(dplyr)) 
suppressPackageStartupMessages(library(tidyr)) 

samples <- tribble(
    ~Sample1, ~Sample2, ~Sample3, 
    6.99, 5.80, 2.5, 
    2.05, 3.04, 3.4,  
    4.50, 4.69, 8.7,  
    4.71, 5.22, 8.6,  
    5.66, 3.65, 3.4,  
    9.76, 2.89, 5.6 
) 

samples 
#> # A tibble: 6 x 3 
#> Sample1 Sample2 Sample3 
#>  <dbl> <dbl> <dbl> 
#> 1 6.99 5.80 2.50 
#> 2 2.05 3.04 3.40 
#> 3 4.50 4.69 8.70 
#> 4 4.71 5.22 8.60 
#> 5 5.66 3.65 3.40 
#> 6 9.76 2.89 5.60 

samples_modified <- samples %>% 
    # Add the multipliers as a column 
    mutate(multiplier = c(1,3,5,7,9,11)) %>% 

    # Gather all the samples. Make it 'tidy' 
    gather(key = "sample", value = "x", -multiplier) %>% 

    # Perform the multiplication on each element, we will sum later 
    mutate(x_modified = x * (-1)^((multiplier - 1)/2)) 

# Now we want to sum the x_modified column for each sample group 
samples_modified %>% 
    group_by(sample) %>% 
    summarise(S = sum(x_modified)) 
#> # A tibble: 3 x 2 
#> sample  S 
#> <chr> <dbl> 
#> 1 Sample1 0.630 
#> 2 Sample2 2.99 
#> 3 Sample3 -3.00 
+0

この機能は完全に機能しています(既におかげさまでありがとうございます)。しかし、私はdata.tableとしてデータを入力すると、データを強制するのに少し問題があります。 samples < - data.table(openxlsx :: read.xlsx( "samples.xlsx"、sheet = 3 )) それから投げつける: > mutate_impl(.data、dots)のエラー: 評価エラー:バイナリ演算子の非数値引数。 as.numericとそれを強制しようとしています。エラー:(リスト)オブジェクトを強制的に 'double'と入力することはできません。私の列の中にはNA値が含まれている可能性もありますが、これは "中断"しますか? – zirconium

+0

私は、上記のトリブルの値の1つを「NA」で置き換え、それでも実行しました。そのサンプルに対して「S」に対して「NA」値を与えただけです。私もtibble(変更されたdata.frame)をdata.tableに強制し、もう一度実行したところ、すべて正常に動作しているようです。実際に問題を診断するには、完全なデータセットを確認する必要があります。あなたは間違いなくdata.tableを数値に強制したくない。それは動作しません。いくつかの列が数値ではなく文字としてインポートされる可能性はありますか? 'sum(サプリー(NAMEOFDATATABLE、is.character))'は何を返しますか? (0にする必要があります) –

0

簡単なようです。 Rはベクトル化されたベクトルの乗算であるためです。そして、sum

zirconium <- function(x){ 
    n <- 2*seq_along(x) - 1 
    sum(x * (-1)^((n - 1)/2)) 
} 

sapply(dT[-1], zirconium) 
#Sample1 Sample2 
# 0.63 2.99 

データ。

dT <- 
structure(list(Condition = structure(1:6, .Label = c("T1", "T2", 
"T3", "T4", "T5", "T6"), class = "factor"), Sample1 = c(6.99, 
2.05, 4.5, 4.71, 5.66, 9.76), Sample2 = c(5.8, 3.04, 4.69, 5.22, 
3.65, 2.89)), .Names = c("Condition", "Sample1", "Sample2"), class = "data.frame", row.names = c(NA, 
-6L)) 
+0

それを適用しようとすると、2進演算子のエラーに数値以外の引数が投げられています:/ class(myData)[1] "data.table" "data.frame"どうしたら強制できますか?私は、data.table(t(na.omit(t(myData)))を使ってNAsをパージしようとしましたが、それは助けになりませんでした。 – zirconium

+0

@ジルコニウム私はそれがエラーを出すならば、質問を編集し、 (dT)の(dput)の(コメントではありません。)このように、私たちはあなたのデータの正確なコピーを持ち、いくつかの答えをそれでテストします。 –

関連する問題