0

行ごとにデータセットに対して算術演算を実行しようとしましたが、観測値が欠落しているため、必要な答えを得ることができませんでした。たとえば、使用すると、apply欠落した観測値が得られました。rowSums最終的に、最初にいくつかの列に-1を掛けることで(それらを減算するのではなく)、目的の答えを得ました。また、ループを使用して目的の答えを得ました。これら 3 つのアプローチと、その他の 1 つのアプローチを以下に示します。

で望みの答えを得ることができapplyますか?私が見落としている簡単な方法はありますか?私の質問は次のようなものです: R で欠落/不完全なデータを処理する - NA をマスクするが削除しない機能はありますか? 私は本当にベースRが好きですが、1つの答えはzooパッケージを見ることを提案しました。アドバイスをありがとう。これは基本的な質問のようです。明らかな解決策を見落としている場合は申し訳ありません。(欠落している観測のタグがないことに気付きました。)

df.1 <- read.table(text='
AA   BB   CC   DD   EE   FF   GG   HH   II   JJ
100   2    3    4    5    6    7    8    9   10
200  12   13   14   15   16   17   18   19   20
300  NA   23   24   25   26   NA   28   29   30
400  32   33   34   35   36   37   38   NA   40
500  42   43   44   45   46   47   48   49   50
', header=T, na.strings = "NA")

# this does not work

apply(df.1[,c("AA","BB", "CC", "DD", "FF", "GG", "II", "JJ")], 1, 
             function(x) {x[1] - (x[2] + x[3] + x[4]) - (x[5] + x[6] + x[7]) + x[8]})

# [1]  79 129  NA  NA 279

df.2 <- data.frame(df.1$AA, df.1$BB, df.1$CC, df.1$DD, df.1$FF, df.1$GG, df.1$II, df.1$JJ)
colnames(df.2) <- c('AA', 'BB', 'CC', 'DD', 'FF', 'GG', 'II', 'JJ')

# this does not work

df.2$AA - (df.2$BB + df.2$CC + df.2$DD) - (df.2$FF + df.2$GG + df.2$II) + df.2$JJ
# [1]  79 129  NA  NA 279

# this works

df.3 <- data.frame(df.2$AA, -1 * df.2$BB, -1 * df.2$CC, -1 * df.2$DD, -1 * df.2$FF, -1 * df.2$GG, -1 * df.2$II, df.2$JJ)

rowSums(df.3, na.rm = TRUE)
# [1]  79 129 228 268 279

# this works

my.sum <- rep(NA, nrow(df.2))

for (i in 1:nrow(df.2)) {
  my.sum[i] <- sum(df.2$AA[i], -1 * df.2$BB[i], -1 * df.2$CC[i], -1 * df.2$DD[i], -1 * df.2$FF[i], -1 * df.2$GG[i], -1 * df.2$II[i], df.2$JJ[i], na.rm = TRUE)
}

my.sum
# [1]  79 129 228 268 279
4

2 に答える 2

3

呼び出しで使用sumし、applyそれに応じて各ベクトルに重みを付けることができます。

weights <- c(1,rep(-1,3),0,rep(-1,2),0,-1,1)

apply(df.1,1,function(x) sum(x*weights,na.rm=T))
[1]  79 129 228 268 279

colSumsこれらの重みを乗じた転置行列で使用する方がおそらく高速ですが、

colSums(t(df.1)*weights,na.rm=T)
[1]  79 129 228 268 279
于 2013-02-28T23:16:22.750 に答える
2

次のように、その場で NA を 0 に置き換えるのはどうでしょうか。

apply(df.1[,c("AA","BB", "CC", "DD", "FF", "GG", "II", "JJ")], 1, 
             function(x) {x[is.na(x)]=0; x[1] - (x[2] + x[3] + x[4]) - (x[5] + x[6] + x[7]) + x[8]})
于 2013-02-28T22:38:52.393 に答える