0

入力自由度:

user attr val       date
100    a  10      2012-11-09
100    b  20      2012-11-08
101    a  11      2012-11-09

出力自由度:

user attr_a val_a date_a     attr_b  val_b date_b
100    a  10      2012-11-09    b     20      2012-11-08 
101    a  11      2012-11-09

入力データ フレームを目的の出力データ フレームに再形成するには、R のヘルプが必要です。

4

2 に答える 2

2


指定された値 (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
于 2012-11-10T01:24:40.330 に答える
0

試す

merge( df[ df$attr == "a", ], df[ df$attr == "b", ], by= "user" )
于 2012-11-09T19:21:08.150 に答える