指定された値 (byVal) を持つ特定の列 (byCol) に基づいてデータ フレームをスプライスする簡単な関数を次に示します。
spliceDF <- function(df, byVal, byCol="attr", preserveField="user") {
# returns spliced df with renamed columns
# identify which rows will be returned
rows <- df[byCol]==byVal
# append the suffix
nm <- names(df)!=preserveField
names(df)[nm] <-
paste(names(df)[nm], byVal, sep="_")
return(df[rows,])
}
次に、次のようにマージで呼び出すことができます
# merge the two spliced data frames
merge(spliceDF(mydf, "a"), spliceDF(mydf, "b"), by="user", all=TRUE)
わかりやすくするために、最後の行を 3 つの別々の行に分けることができます
# Splice the df into two separate dfs
df_a <- spliceDF(mydf, byVal="a", byCol="attr")
df_b <- spliceDF(mydf, byVal="b", byCol="attr")
# mrege the two into one
merge(df_a, df_b, by="user", all=TRUE)
上記の例のコード
# build the data frame from your example
mydf <- data.frame(user=c(100,100,101),
attr=c("a","b","a"),
val =c(10, 20, 11),
date=c(2012-11-09,2012-11-08,2012-11-09)
)
アップデート:
を見ると?merge()
、接尾辞引数があります。
suffixes=c("_a", "_b") を試すとうまくいきます。
merge(df[df$attr=="a", ], df[df$attr=="b", ],
by="user", suffixes=c("_a", "_b"), all=TRUE)
# OUTPUT
user attr_a val_a date_a attr_b val_b date_b
1 100 a 10 1992 b 20 1993
2 101 a 11 1992 <NA> NA NA