2017-09-27 22 views
0

申し訳ありませんが、それは非常に基本的なポイントかもしれませんが、私は便利なツールを見つけることができません。data.tableの列間の相違

私は(かなり大きい)データテーブルを持っていると列間の違いにしたい、それは私がBを差分した後、Aの残っているものである新しい列Eを作成したい

A  B  C  D 

9  N.A. 3  2 
15 4  N.A. N.A. 
N.A. N.A 2  3 

あり、C 、およびD.列B、CおよびDのNAsについては、ゼロとみなすことができるが、AIにNAがある場合、この観察を無視しなければならない。 DT [(DT $ A == "NA")!]

と - だから、最終的な結果は

A  B  C  D  E 

9  N.A. 3  2  4 
15 4  N.A. N.A. 11 
私は DT <によってAにNAのあるDTのすべての列を削除した

する必要があります私は DT [、E:= lapply(.SD、diff)、.SDcols = c( "A"、 "B"、 "C"、 "D")]を試しました。 しかし、それはN.A.のために失敗します。 私は手動でN.A.sを0に変更したくないのです(後で、実際のゼロと何を書き換えたのかを区別したいかもしれないからです) - 私は関数内でそれをやりたいのです。誰か良いアイデアはありますか?

答えて

0

私はすべての列が文字型でアーカンソーと仮定します。

require(data.table) 

DT <- data.table(A = c("9", "15", "N.A."), 
       B = c("N.A.", "4", "N.A."), 
       C = c("3", "N.A.", "2"), 
       D = c("2", "N.A.", "3")) 
DT <- DT[A != "N.A."] 

行番号を計算します。

DT[, rownum := .I] 

N.A.を数値に変換できないため、警告が表示されます。

DT[, E := as.numeric(A) - sum(as.numeric(B), 
           as.numeric(C), 
           as.numeric(D), na.rm = T), by = rownum] 
DT 
1

ここに行く:

df$E[!is.na(df$A)] = 2*df$A[!is.na(df$A)] - rowSums(df[!is.na(df$A),], na.rm = T) 

例:

df = data.frame(A = c(19,25,NA,17),B = c(1,2,3,4), C = c(5,NA,NA,9), D = c(3,1,2,NA)) 

>df 
    A B C D 
1 19 1 5 3 
2 25 2 NA 1 
3 NA 3 NA 2 
4 17 4 9 NA 

df$E[!is.na(df$A)] = 2*df$A[!is.na(df$A)] - rowSums(df[!is.na(df$A),], na.rm = T) 

> df 
    A B C D E 
1 19 1 5 3 10 
2 25 2 NA 1 22 
3 NA 3 NA 2 NA 
4 17 4 9 NA 4