10

したがって、次のような2つの要素と1つの数値変数を持つデータフレームがあります。

>D
f1 f2 v1 
1   A  23
2   A  45
2   B  27
     .
     .
     .

したがって、f1 のレベルは 1 と 2 であり、f2 のレベルは A と B です。ここでは、f1=1 かつ f2=B の場合に入力される値はありません (つまり、D$V1[D$f1=1 & D$f2=B] はありません) 実際には、これはゼロのはずです。

実際のデータ フレームには、11 レベルの f1 と 150 レベル近くの f2 があり、データ フレームにない f1 と f2 のすべての組み合わせに対して v1=0 で観測を作成する必要があります。

どうすればこれを行うことができますか?

前もって感謝します、

イアン

4

3 に答える 3

12

データの使用:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")),
                  v1 = c(23,45,27))

1 つのオプションは、レベルの組み合わせでルックアップ テーブルを作成することです。これは、expand.grid()以下に示すように、両方の因子のレベルで提供される関数を使用して行われます。

dat2 <- with(dat, expand.grid(f1 = levels(f1), f2 = levels(f2)))

merge()次に、参照テーブルのすべての値が結合に含まれるように指定する関数を使用して、データベースのような結合操作を実行できます ( all.y = TRUE)

newdat <- merge(dat, dat2, all.y = TRUE)

上記の行は以下を生成します。

> newdat
  f1 f2 v1
1  1  A 23
2  1  B NA
3  2  A 45
4  2  B 27

ご覧のとおり、欠落している組み合わせにはNA欠落度を示す値が与えられています。NAこれらの をに置き換えるのは非常に簡単0です。

> newdat$v1[is.na(newdat$v1)] <- 0
> newdat
  f1 f2 v1
1  1  A 23
2  1  B  0
3  2  A 45
4  2  B 27
于 2012-06-08T19:12:51.187 に答える
4

ソリューションを追加してtidyr、広げてfill=0収集します。

library(tidyr)
df %>% spread(f2, v1, fill=0) %>% gather(f2, v1, -f1)

#  f1 f2 v1
#1  1  A 23
#2  2  A 45
#3  1  B  0
#4  2  B 27

同様に行うことができますdf %>% spread(f1, v1, fill=0) %>% gather(f1, v1, -f2)

于 2016-10-16T21:10:56.807 に答える