可能性のある複製:
このRの整形は簡単ですが
dcast
from reshape2
は、重複がない数式なしで機能します。次のサンプルデータを見てください。
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
したいので、デフォルトのlength
を含むvalue.var
に関数を適用せずに、値を表にまとめます。
この場合、問題なく動作します。
> 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をキャストするときの結果:
id SS SV
1 A 220 224
2 B 222 225
3 C 223 220
4. C NA 1
私はそれを直接行う方法はないと思いますが、私たちを助ける追加の列を追加することができます
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
デイソンが私の答えをしている間に私は同じ解決策を見つけました。
私は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