如何重塑这个数据框架?

时间:2012-11-09 18:57:29

标签: r dataframe transpose

输入df:

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

输出df:

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中需要帮助将输入数据帧重新整形为所需的输出数据帧。

2 个答案:

答案 0 :(得分: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)

为清楚起见,最后一行可以分为三个单独的行

# 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)
                  )

UPDATE:

查看?merge(),它有一个后缀参数 尝试后缀= c(&#34; _a&#34;,&#34; _b&#34;)效果很好。

    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

答案 1 :(得分:0)

尝试

merge( df[ df$attr == "a", ], df[ df$attr == "b", ], by= "user" )