25

重複の可能性:
この R の再形成は単純なはずですが、

dcastfromreshape2は、重複がない数式なしで機能します。次のサンプル データを使用します。

df <- structure(list(id = c("A", "B", "C", "A", "B", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 224L, 
225L, 2206L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-6L))

これらのデータを取得したいのですが、デフォルトを含むにdcast関数を適用せずに、値を表にまとめます。value.varlength

この場合、正常に動作します。

> dcast(df, id~cat, value.var="val")
  id  SS   SV
1  A 220  224
2  B 222  225
3  C 223 2206

ただし、変数が重複している場合、 はfunデフォルトでlength. それを回避する方法はありますか?

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L))

> dcast(df2, id~cat, value.var="val")
Aggregation function missing: defaulting to length
  id SS SV
1  A  1  1
2  B  1  1
3  C  1  2

理想的には、私が探しているのは、fun = NAを集約しようとしないように、を追加することvalue.varです。df2 を dcasting したときの結果:

 id  SS  SV
1  A 220 224
2  B 222 225
3  C 223 220
4. C NA  1
4

2 に答える 2

22

直接行う方法はないと思いますが、役立つ追加の列を追加できます

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L))

library(reshape2)
library(plyr)
# Add a variable for how many times the id*cat combination has occured
tmp <- ddply(df2, .(id, cat), transform, newid = paste(id, seq_along(cat)))
# Aggregate using this newid and toss in the id so we don't lose it
out <- dcast(tmp, id + newid ~ cat, value.var = "val")
# Remove newid if we want
out <- out[,-which(colnames(out) == "newid")]
> out
#  id  SS  SV
#1  A 220 224
#2  B 222 225
#3  C 223 220
#4  C  NA   1
于 2012-10-11T03:42:18.387 に答える
9

Dasonが私の回答をしている間に、私は同じ解決策を見つけました。

dcast重複の処理方法がわからないことに気づきました。重複によって混乱しないように、別の一意の識別子を追加することで、それをだます方法を見つけました。

この例では:

df <- ddply(df2, .(cat), function(x){ x$id2 = 1:nrow(x); x})
>  dcast(df, id+id2~cat, value.var="val")[,-2]
  id  SS  SV
1  A 220 224
2  B 222 225
3  C 223 220
4  C  NA   1
于 2012-10-11T03:45:09.660 に答える