2017-01-27 5 views
1

光沢のあるアプリケーションでデータを計算するのに最適で効率的な方法を見つけるにはいくつかの問題があります。まず、すべての列(IDを除く)と1つの列との差を計算し、それぞれに(特定の名前の)新しい列を作成し、さらに小さな計算を実行したいと思います。私は例のデータにそれを説明するつもりです:私がやりたい何R他のすべての列の値の差を計算する

ID Zeit600 Zeit650 Zeit700 Zeit750 Zeit800 
1 1 601.7826 504.7059 321.2658 264.3038 207.3418 
2 2 602.6250 546.6667 316.6667 261.1111 205.5556 

がにある:ここでは

data <- structure(list(ID = 1:2, Zeit600 = c(601.782608695652, 602.625 
), Zeit650 = c(504.705882352941, 546.666666666667), Zeit700 = c(321.26582278481, 
                   316.666666666667), Zeit750 = c(264.303797468354, 261.111111111111 
                   ), Zeit800 = c(207.341772151899, 205.555555555556)), row.names = c(NA, 
                                    -2L), .Names = c("ID", "Zeit600", "Zeit650", "Zeit700", "Zeit750", 
                                        "Zeit800"), class = "data.frame") 

すると、その簡単には見を持っているという形で同じデータであります(それは次ツァイトにT800_the数可能である場合)

カラムZeit800名前と命名するすべてのカラム(ID除く)との差を計算します。

*私の元のデータは光沢があり、従って列の数はZeit...と異なり、列Zeit800は常に残ります。

ID Zeit600 Zeit650 Zeit700 Zeit750 Zeit800 T800_T600 T800_T650 T800_T700 T800_T750 
1 1 601.7826 504.7059 321.2658 264.3038 207.3418 394.4408 297.3641 113.9241 56.96203 
2 2 602.6250 546.6667 316.6667 261.1111 205.5556 397.0694 341.1111 111.1111 55.55556 

は、私は、小さな計算を実行する列名の次Zeit... 800と数との差を計算したい、とで割り:

結果は次のようになります。上記でポイントで実行された計算値(T800...)。

800-600/T800_600 = 800-600/394.4408 = 0.507

全体のデータフレームは、次のようになります:

ID Zeit600 Zeit650 Zeit700 Zeit750 Zeit800 T800_T600 T800_T650 T800_T700 T800_T750 Abkuehlrate_T800_600 Abkuehlrate_T800_650 
1 1 601.7826 504.7059 321.2658 264.3038 207.3418 394.4408 297.3641 113.9241 56.96203   0.5070469   0.5044321 
2 2 602.6250 546.6667 316.6667 261.1111 205.5556 397.0694 341.1111 111.1111 55.55556   0.5036902   0.4397394 
    Abkuehlrate_T800_700 Abkuehlrate_T800_750 
1   0.8777778   0.8777778 
2   0.9000000   0.9000000 

助けをありがとうだから、例えばID=1ためのコラムZeit600のためにこれを計算することができます!

答えて

2

は今ここに全体の動作は、関数の形である:

myfun <- function(var, compvar, data) { 
    diffcol <- as.data.frame(lapply(data[var], function(x) x-data[compvar])) 
    names(diffcol) <- paste(compvar, var, sep = "_") 
    mydata <- cbind(data, diffcol) 

    abkuehlrate <- as.data.frame(mapply(function(x, y) 
    (as.numeric(gsub("T", "", compvar))-as.numeric(gsub("T", "", x)))/y, var, diffcol, SIMPLIFY = FALSE)) 
    names(abkuehlrate) <- paste("Abkuehlrate", compvar, gsub("T", "", var), sep = "_") 
    mydata <- cbind(mydata, abkuehlrate) 
    return(mydata) 
} 

あなたは自分の名前の文字列としてそれを変数を供給し、データを提供することにより、それを使用する:

mydf <- myfun("T600", "T800", mydf) 

この方法では、変数名の文字列で関数を使用するだけで、任意の方法でデータから抽出することができます。例:

myvars <- names(mydf[,2:5]) 
newdf <- myfun(myvars, "T800", mydf) 

出力:

> newdf 
    ID  T600  T650  T700  T750  T800 T800_T600 T800_T650 T800_T700 T800_T750 Abkuehlrate_T800_T600 
1 1 601.7826 504.7059 321.2658 264.3038 207.3418 394.4408 297.3641 113.9241 56.96203    0.5070469 
2 2 602.6250 546.6667 316.6667 261.1111 205.5556 397.0694 341.1111 111.1111 55.55556    0.5036902 

    Abkuehlrate_T800_T650 Abkuehlrate_T800_T700 Abkuehlrate_T800_T750 
1    0.5044321    0.8777778    0.8777778 
2    0.4397394    0.9000000    0.9000000 

編集:あなたが望んでいた正確な変数名を取得するために、最終的な小さな編集。変数の名前をZeit600などとする必要がある場合は、gsub()操作で"T"を代わりに"Zeit"に置き換えてください。

+0

非常によく見えます!私のデータ(この場合は 'mydf')は光沢があり、反応性の列数を持っています。これは、2,3,5またはそれ以外の数の列がある可能性があることを意味します**' Zeit ... '。つまり、私は '... mydf [、2:4] ...'を使うことはできません。解決策は一般的でなければなりません。 –

+0

それは本当に重要ではありませんが、abkuehlraten列を計算するには相違する列が必要です –

+0

興味深いですが、あなたのコードを実行すると、エラーが表示されます: 'data.frame(...、check.names = FALSE)のエラー: 引数の行数の違いが暗示されます:2、3さらに:警告メッセージ: 1:オブジェクトの長さがオブジェクトの長さの倍数ではない 2:In(as、 長いオブジェクトの長さは短いオブジェクトの倍数の倍数ではありません 3:In(as.numeric() gsub( "T"、 ""、compvar)) - as.numeric(gsub( "T"、 ""、: より長いobjec t長さは短いオブジェクトの倍数ではありません。 ' –

2
subData <- subset(data,select = - c(ID, Zeit800)) 
numbers <- as.numeric(gsub("\\D", "", names(subData))) 
namesT <- paste0("T800_T", numbers) 
T800 <- subData-data$Zeit800 
data[,namesT] <- T800 
namesAbkuehlrate <- paste0("Abkuehlrate_T800_", numbers) 
data[,namesAbkuehlrate] <- mapply('/', (800-numbers), T800) 
関連する問題