如何旋转/取消旋转(投射/融化)数据框? [复制]

Posted

技术标签:

【中文标题】如何旋转/取消旋转(投射/融化)数据框? [复制]【英文标题】:how to pivot/unpivot (cast/melt) data frame? [duplicate] 【发布时间】:2011-12-20 06:29:21 【问题描述】:

如何“反透视”表格?正确的技术术语是什么?

更新:这个词叫做melt

我有一个国家数据框和每年的数据

Country     2001    2002    2003
Nigeria     1       2       3
UK          2       NA       1

我想拥有类似的东西

Country    Year    Value
Nigeria    2001    1
Nigeria    2002    2
Nigeria    2003    3
UK         2001    2
UK         2002    NA
UK         2003    1

【问题讨论】:

【参考方案1】:

我仍然不敢相信我以一个答案击败了安德烈。 :)

> library(reshape)
> my.df <- read.table(text = "Country     2001    2002    2003
   + Nigeria     1       2       3
   + UK          2       NA       1", header = TRUE)
> my.result <- melt(my.df, id = c("Country"))
> my.result[order(my.result$Country),]
     Country variable value
   1 Nigeria    X2001     1
   3 Nigeria    X2002     2
   5 Nigeria    X2003     3
   2      UK    X2001     2
   4      UK    X2002    NA
   6      UK    X2003     1

【讨论】:

你也打败了我。还可以尝试:check.names=FALSE 在阅读时获得没有 X 前缀的年份,或者 sub("^X","",variable) 稍后将它们剥离;和as.numeric(variable) 转换回数值 谢谢!我想技术术语是“融化”桌子。对吗? 是的——至少这可能是 R 圈子中最常用的术语,这要归功于惊人的 reshape 包(就我而言,它引入了“熔化”和“铸造”的术语知道) +1 那么谁在使用 R 2.14?看看text=read.table 的参数!【参考方案2】:

这个问题的基本 R reshape 方法非常难看,特别是因为名称不是reshape 喜欢的形式。如下所示,第一行 setNames 将列名修改为 reshape 可以使用的名称。

reshape(
  setNames(mydf, c("Country", paste0("val.", c(2001, 2002, 2003)))), 
  direction = "long", idvar = "Country", varying = 2:ncol(mydf), 
  sep = ".", new.row.names = seq_len(prod(dim(mydf[-1]))))

base R 中更好的替代方法是使用stack,如下所示:

cbind(mydf[1], stack(mydf[-1]))
#   Country values  ind
# 1 Nigeria      1 2001
# 2      UK      2 2001
# 3 Nigeria      2 2002
# 4      UK     NA 2002
# 5 Nigeria      3 2003
# 6      UK      1 2003

现在还有用于重塑数据的新工具,例如“tidyr”包,它为我们提供了gather。当然,tidyr:::gather_.data.frame 方法只是调用了reshape2::melt,所以我的这部分答案除了介绍您可能在 Hadleyverse 中遇到的新语法之外,不一定要添加太多内容。

library(tidyr)
gather(mydf, year, value, `2001`:`2003`) ## Note the backticks
#   Country year value
# 1 Nigeria 2001     1
# 2      UK 2001     2
# 3 Nigeria 2002     2
# 4      UK 2002    NA
# 5 Nigeria 2003     3
# 6      UK 2003     1

如果您想要问题中显示的行顺序,则此处的所有三个选项都需要对行进行重新排序。


第四个选项是使用我的“splitstackshape”包中的merged.stack。与基本 R 的 reshape 一样,您需要将列名修改为包含“变量”和“时间”指示符的名称。

library(splitstackshape)
merged.stack(
  setNames(mydf, c("Country", paste0("V.", 2001:2003))),
  var.stubs = "V", sep = ".")
#    Country .time_1  V
# 1: Nigeria    2001  1
# 2: Nigeria    2002  2
# 3: Nigeria    2003  3
# 4:      UK    2001  2
# 5:      UK    2002 NA
# 6:      UK    2003  1

样本数据

 mydf <- structure(list(Country = c("Nigeria", "UK"), `2001` = 1:2, `2002` = c(2L, 
     NA), `2003` = c(3L, 1L)), .Names = c("Country", "2001", "2002",               
     "2003"), row.names = 1:2, class = "data.frame")   

【讨论】:

列子集的反引号...?为什么。我也刚开始擅长 dplyr。哈哈【参考方案3】:

您可以使用reshape 包中的melt 命令。见这里:http://www.statmethods.net/management/reshape.html

可能类似于melt(myframe, id=c('Country'))

【讨论】:

以上是关于如何旋转/取消旋转(投射/融化)数据框? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何旋转 Spark 数据框表? [复制]

如何在数据框中旋转包含字符串的一列? [重复]

如何通过取消旋转标题行来转置Excel中的列[重复]

如何使用 dplyr 熔化和投射数据帧?

如何旋转数据框?

如何旋转数据框?