2017-04-27 5 views
5

複数の列の値のいくつかの要約統計量を抽出したいと思います。各固有IDの要約を取得するには

for (i in levels(df$id)) 
{ 
    extract.event <- df[df$id==i,]# To identify each section 
ppace <- table(extract.event$pace) #count table of pace 
ptype <- extract.event$type[1] # extract the first line to be the type 
nvalues <- table(extract.event$value) #count table of value 
nabundance <- min(extract.event$abundance) #minimum of abundance 

d <- cbind(ppace,ptype,forbeh,nvalues,nabundance) 

が、私は値をマージ問題に実行しています:私はいくつかのコードを書い始めている

id    pace  type     value  abundance 
51    (T)  (JC)     (L)   0   
51    (T)  (JC)     (L)   0 
51    (T)  (JC)     (H)   0 
52    (T)  (JC)     (H)   0 
52    (R)  (JC)     (H)   0 
53    (T)  (JC)     (L)   1 
53    (T)  (JC)     (H)   1 
53    (R)  (JC)     (H)   1 
53    (R)  (JC)     (H)   1 
53    (R)  (JC)     (H)   1 
54    (T)  (BC)     <blank>   0   

54    (T)  (BC)     <blank>   0 
54    (T)  (BC)     <blank>   0 

を次のように私のデータを見て、私はこの

id ptype  (T) (R)  (L)  (H)  abundance 
51  (JC)  3  0   2  1   0 
52  (JC)  1  1   0  2   0 
53  (JC)  2  3   1  4   1 
54  (BC)  3  0   0  0   0 

ような何かを期待しています特に、空きが空のテーブルを印刷するとき。私はデータフレームに非常に多くの名前があるので、名前で抽出したくないと思います。何か案は?私はplyrパッケージに何かかもしれないと思ったが、それでもわからない...

おかげで、

グレース

答えて

3

は、私は今後の参考のために(あなたのdata.frameを書き換えなければならなかった結果を貼り付けてくださいあなたのデータの書き換えが嫌いなので、私たちの試みです)。私はあなたが集約関数の線に沿って何かを探している推測している:

df <- data.frame(id = as.factor(c(51,51,51,52,52,53,53,53,53,53,54,54,54)), 
     pace = c("(T)","(T)","(T)","(T)","(R)","(T)","(T)","(R)","(R)","(R)","(T)","(T)","(T)"), 
     type = c("(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(JC)","(BC)","(BC)","(BC)"), value = c("(L)","(L)","(H)","(H)","(H)","(L)","(H)","(H)","(H)","(H)","<blank>","<blank>","<blank>"), 
     abundance = c(0,0,0,0,0,1,1,1,1,1,0,0,0)) 

smallnames <- colnames(do.call("cbind",as.list(aggregate(cbind(value, pace, abundance) ~ id + type, data = lapply(df, as.character), table)))) 
smallnames 
[1] "id"  "type" "(H)"  "(L)"  "<blank>" "(R)"  "(T)"  "0"  
[9] "1" 

df.new <- do.call("data.frame", as.list(aggregate(cbind(value, pace, abundance) ~ id + type, data = lapply(df, as.character), table))) 
colnames(df.new) <- smallnames 
df.new$abundance <- df.new$`1` 
df.new 
    id type (H) (L) <blank> (R) (T) 0 1 abundance 
1 54 (BC) 0 0  3 0 3 3 0   0 
2 51 (JC) 1 2  0 0 3 3 0   0 
3 52 (JC) 2 0  0 1 1 2 0   0 
4 53 (JC) 4 1  0 3 2 0 5   5 

df.final <- df.new[, -which(colnames(df.new) %in% c("<blank>","0","1"))] 
df.final 
    id type (H) (L) (R) (T) abundance 
1 54 (BC) 0 0 0 3   0 
2 51 (JC) 1 2 0 3   0 
3 52 (JC) 2 0 1 1   0 
4 53 (JC) 4 1 3 2   5 

が、これはあなたがそれに問題がある場合は、あなたが探したりしているものであれば、私に教えてください。

+0

part2があなたの望むデータフレームの出力に似ている編集を参照してください。 –

+2

'集合(cbind(値、ペース、豊富)〜id +タイプ、データ= lapply(df、as.character)そこに少し簡単に – user2957945

+0

それはきちんとしたコード行ですが、豊富を追加すると、0と1のカウントを処理することに気付くでしょう。さらに、集計は実際には内部に行列を持つデータフレームを残します。パート1 as.list集約オブジェクトでdo.call + cbindを使用して、名前をより明確にし(質問のとおり)、適切にフォーマットしました(単純なdata.frame)。 Part2(醜い見た目)は、単にOPが尋ねるように見えるように強制します。私はcbindの使い方が好きです。+1 –

関連する問題