R 如何旋转/取消旋转(铸造/熔化)数据帧?

R 如何旋转/取消旋转(铸造/熔化)数据帧?,r,pivot-table,reshape,reshape2,R,Pivot Table,Reshape,Reshape2,我怎样才能“取消”一张桌子?什么是合适的技术术语 更新:术语称为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

我怎样才能“取消”一张桌子?什么是合适的技术术语

更新:术语称为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

我还是不敢相信我的回答打败了安德烈

>库(重塑)
>my.df my.result my.result[订单(my.result$Country),]
国家变量值
1尼日利亚X2001 1
3尼日利亚X2002 2
5尼日利亚X2003 3
2英国X2001 2
4英国X2002北美
6英国X2003 1

您可以使用
重塑
软件包中的
熔化
命令。请看这里:


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

这个问题的基本R
restrape
方法非常难看,特别是因为名称的形式不是
restrape
喜欢的。它类似于下面的内容,其中第一行
setNames
将列名修改为
重塑
可以使用的内容

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中更好的替代方法是使用
堆栈
,如下所示:

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_uu.data.frame
方法只调用
restrape2::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
。与base R的
重塑
类似,您需要将列名修改为包含“变量”和“时间”指示符的内容

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你也打败了我。还可以尝试:
check.names=FALSE
在读取时获取没有X前缀的年份,或者
sub(“^X”,variable)
以后删除它们;和
as.numeric(variable)
转换回数值谢谢!我猜技术术语是“融化”桌子。是吗?是的——至少这可能是R圈中最常用的术语,这要归功于神奇的
重塑
包(据我所知,它引入了“熔化”和“铸造”的术语)+1那么谁在使用R2.14呢?查看
text=
参数到
read.table
!列子集的反勾号。。。?为什么?我也只是越来越擅长dplyr。哈哈
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")