3


週、プローブ、観測数の3つの列を持つRのログを収集しています。
観測がない場合は記録がありません。

week=c(1,2,2,4)  
probe=c("A","C","B","C")  
obs=c(2,4,3,1)
logs=data.frame(week,probe,obs)

logs

week probe obs  
1     A   2
2     C   4
2     B   3
4     C   1

観測がなかった場合でも、すべての週とすべてのプローブが含まれるようにデータを再フォーマットして、次のようにします。

week probe obs  
1     A   2  
1     B   0  
1     C   0  
1     D   0  
2     A   0  
2     B   0  
2     C   3  
2     D   4  
3     A   0  
3     B   0  
3     C   0  
3     D   0  
4     A   0  
4     B   0  
4     C   1  
4     D   0  

ここにすべてのプローブのリストがあります:

allprobes=c("A","B","C","D")

そして私はこれらの週を見たいと思います:

allweeks=c(1:4)

私はメルト、キャスト、リシェイプを見てきましたが、実際にはログの元の形式を維持したいので、IDまたは月ごとに1行しか取得できません。最初は簡単に思えますが、今は行き詰まっています...この方法でデータをフォーマットする方法について何かアドバイスはありますか?

助けてくれてありがとう。

4

2 に答える 2

9

ベースRの2つのオプション:

使用expand.gridmerge

> fullFrame <- expand.grid(allweeks, allprobes)
> names(fullFrame) <- c("week", "probe")
> merge(fullFrame, logs, all = TRUE)
   week probe obs
1     1     A   2
2     1     B  NA
3     1     C  NA
4     1     D  NA
5     2     A  NA
6     2     B   3
7     2     C   4
8     2     D  NA
9     3     A  NA
10    3     B  NA
11    3     C  NA
12    3     D  NA
13    4     A  NA
14    4     B  NA
15    4     C   1
16    4     D  NA

expand.griddata.frame「allprobes」オブジェクトと「allweeks」オブジェクトのすべての可能な組み合わせのを作成します。次に、を使用するときにdata.frame「ログ」の関連する列と一致するように、その新しい列の名前を変更します。引数は、欠落している値を。で埋めるように指示します。data.framemergeall = TRUEmergeNA

の代わりにゼロが必要な場合は、次の手順にNA従います。

fullFrame <- expand.grid(allweeks, allprobes)
names(fullFrame) <- c("week", "probe")
finalLogs <- merge(fullFrame, logs, all = TRUE)
finalLogs[is.na(finalLogs)] <- 0

xtabs「週」と「プローブ」を係数に変換した後に使用します

「週」と「プローブ」を関連するすべてのレベルを含む係数に変換する場合は、次のようxtabsにラップして使用できdata.frameます。

logs$week <- factor(logs$week, levels=c(1, 2, 3, 4))
logs$probe <- factor(logs$probe, levels=c("A", "B", "C", "D"))
data.frame(xtabs(obs ~ week + probe, logs))
#    week probe Freq
# 1     1     A    2
# 2     2     A    0
# 3     3     A    0
# 4     4     A    0
# 5     1     B    0
# 6     2     B    3
# 7     3     B    0
# 8     4     B    0
# 9     1     C    0
# 10    2     C    4
# 11    3     C    0
# 12    4     C    1
# 13    1     D    0
# 14    2     D    0
# 15    3     D    0
# 16    4     D    0
于 2013-02-28T19:17:18.567 に答える
1

パッケージ内のcomplete関数は、tidyrこの操作に適したユーティリティです。

# get all the levels in the factor
logs$probe = factor(logs$probe, levels = allprobes)
logs$week = factor(logs$week, levels = 1:4)

tidyr::complete(logs, week, probe, fill = list(obs = 0))
# # A tibble: 16 × 3
#      week  probe   obs
#    <fctr> <fctr> <dbl>
# 1       1      A     2
# 2       1      B     0
# 3       1      C     0
# 4       1      D     0
# 5       2      A     0
# 6       2      B     3
# 7       2      C     4
# 8       2      D     0
# 9       3      A     0
# 10      3      B     0
# 11      3      C     0
# 12      3      D     0
# 13      4      A     0
# 14      4      B     0
# 15      4      C     1
# 16      4      D     0
于 2016-11-13T08:34:24.053 に答える