Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将数据从长格式改为宽格式_R_Reshape_R Faq - Fatal编程技术网

R 如何将数据从长格式改为宽格式

R 如何将数据从长格式改为宽格式,r,reshape,r-faq,R,Reshape,R Faq,我无法重新排列以下数据帧: set.seed(45) dat1 <- data.frame( name = rep(c("firstName", "secondName"), each=4), numbers = rep(1:4, 2), value = rnorm(8) ) dat1 name numbers value 1 firstName 1 0.3407997 2 firstName 2 -

我无法重新排列以下数据帧:

set.seed(45)
dat1 <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )

dat1
       name  numbers      value
1  firstName       1  0.3407997
2  firstName       2 -0.7033403
3  firstName       3 -0.3795377
4  firstName       4 -0.7460474
5 secondName       1 -0.8981073
6 secondName       2 -0.3347941
7 secondName       3 -0.5013782
8 secondName       4 -0.1745357

我已经研究了
melt
cast
以及其他一些东西,但似乎没有一个能完成这项工作。

您可以使用
restrape()
函数,或者使用restrape包中的
melt()
/
cast()
函数来完成这项工作。对于第二个选项,示例代码为

library(reshape)
cast(dat1, name ~ numbers)
或者使用
重塑2

library(reshape2)
dcast(dat1, name ~ numbers)

使用您的示例数据帧,我们可以:

xtabs(value ~ name + numbers, data = dat1)

使用
重塑
功能:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
aggregate(value ~ name, dat1, I)

# name           value.1  value.2  value.3  value.4
#1 firstName      0.4145  -0.4747   0.0659   -0.5024
#2 secondName    -0.8259   0.1669  -0.8962    0.1681
df$id   <- c(rep("year1", 12), rep("year2", 12))
df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_")
df_wide
新的(2014年)
tidyr
软件包也很简单,其中
collect()
/
spread()
melt
/
cast
的术语

编辑:现在,在2019年,tidyr v 1.0已经启动并将
spread
gather
设置在一个弃用路径上,更倾向于
pivot\u Brother
pivot\u longer
,您可以找到描述。如果你想简单地了解一下spread/gather的短暂生活,请继续阅读

library(tidyr)
spread(dat1, key = numbers, value = value)

tidyr
是对
Reforme2
的重构,旨在配合整洁的数据框架,并与
magrittr
dplyr
携手合作,为数据分析构建坚实的管道

正如
restrape2
所做的小于restrape2一样,
tidyr
所做的小于
restrape2
。它是专门为整理数据而设计的,而不是
restrape2
所做的一般整形,也不是restrape2所做的一般聚合。特别是,内置方法仅适用于数据帧,
tidyr
不提供任何边距或聚合

其他两种选择:

基本包:

df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df

如果考虑性能,另一种选择是使用
数据.table
重塑2
的melt&dcast函数的扩展

()

而且,从data.table v1.9.6开始,我们可以对多个列进行强制转换

## add an extra column
dat1[, value2 := value * 2]

## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))

#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627

使用基本R
聚合
函数:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
aggregate(value ~ name, dat1, I)

# name           value.1  value.2  value.3  value.4
#1 firstName      0.4145  -0.4747   0.0659   -0.5024
#2 secondName    -0.8259   0.1669  -0.8962    0.1681
df$id   <- c(rep("year1", 12), rep("year2", 12))
df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Win Vector的genius数据科学家们推出了一个非常强大的新软件包,名为
cdata
seplyr
replyr
。它实现了中以及中所述的“协调数据”原则。其思想是,无论您如何组织数据,都应该能够使用“数据坐标”系统识别单个数据点。以下是John Mount最近博客文章的摘录:

整个系统基于两个原语或运算符 cdata::moveValuesToRowsD()和cdata::moveValuesToColumnsD()。这些 运营商有枢轴,非枢轴,一个热编码,转置,移动 多行和多列,以及许多其他转换为简单的特殊 案例

根据数据类型编写许多不同的操作是很容易的 cdata原语。这些操作员可以在内存中工作,也可以在大数据中工作 扩展(使用数据库和Apache Spark;对于大数据,请使用 cdata::moveValuesToRowsN()和cdata::moveValuesToColumnsN() 变体)。变换由一个控制表控制,该控制表 它本身就是变换的一个图表(或图片)

我们将首先构建控制表(有关详细信息,请参阅),然后执行数据从行到列的移动

library(cdata)
# first build the control table
pivotControlTable <- buildPivotControlTableD(table = dat1, # reference to dataset
                        columnToTakeKeysFrom = 'numbers', # this will become column headers
                        columnToTakeValuesFrom = 'value', # this contains data
                        sep="_")                          # optional for making column names

# perform the move of data to columns
dat_wide <- moveValuesToColumnsD(tallTable =  dat1, # reference to dataset
                    keyColumns = c('name'),         # this(these) column(s) should stay untouched 
                    controlTable = pivotControlTable# control table above
                    ) 
dat_wide

#>         name  numbers_1  numbers_2  numbers_3  numbers_4
#> 1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
#> 2 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
库(cdata)
#首先构建控制表
pivotControlTable 1 firstName 0.3407997-0.7033403-0.3795377-0.7460474
#>2第二名称-0.8981073-0.3347941-0.5013782-0.1745357

基本的
重塑功能工作得非常好:

df <- data.frame(
  year   = c(rep(2000, 12), rep(2001, 12)),
  month  = rep(1:12, 2),
  values = rnorm(24)
)
df_wide <- reshape(df, idvar="year", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

请记住,
idvar
是必需的!
timevar
v.names
部分很简单。此函数的输出比其他函数的输出更可预测,因为所有函数都是明确定义的。

对于开发版本的
tidyr
'0.8.3.9000'
,有
pivot\u-wide
pivot\u-long
,这两个函数被广义化以进行整形(分别为长->宽->宽->长)从1到多个列。使用OP的数据

-单列长->宽

library(dplyr)
library(tidyr)
dat1 %>% 
    pivot_wider(names_from = numbers, values_from = value)
# A tibble: 2 x 5
#  name          `1`    `2`    `3`    `4`
#  <fct>       <dbl>  <dbl>  <dbl>  <dbl>
#1 firstName   0.341 -0.703 -0.380 -0.746
#2 secondName -0.898 -0.335 -0.501 -0.175
库(dplyr)
图书馆(tidyr)
dat1%>%
枢轴(名称从=数字,值从=值)
#一个tibble:2x5
#名称'1``2``3``4`
#               
#1名字0.341-0.703-0.380-0.746
#2第二名称-0.898-0.335-0.501-0.175
->创建了另一列以显示功能

dat1 %>% 
    mutate(value2 = value * 2) %>% 
    pivot_wider(names_from = numbers, values_from = c("value", "value2"))
# A tibble: 2 x 9
#  name       value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
#  <fct>        <dbl>   <dbl>   <dbl>   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
#1 firstName    0.341  -0.703  -0.380  -0.746    0.682   -1.41    -0.759   -1.49 
#2 secondName  -0.898  -0.335  -0.501  -0.175   -1.80    -0.670   -1.00    -0.349
dat1%>%
变异(value2=值*2)%>%
枢轴(名称从=数字,值从=c(“值”,“值2”))
#一个tibble:2x9
#名称值\u 1值\u 2值\u 3值\u 4值2\u 1值2\u 2值2\u 3值2\u 4
#                                   
#1名字0.341-0.703-0.380-0.746 0.682-1.41-0.759-1.49
#2第二名称-0.898-0.335-0.501-0.175-1.80-0.670-1.00-0.349
更简单的方法

devtools::install_github("yikeshu0611/onetree") #install onetree package

library(onetree)
widedata=reshape_toWide(data = dat1,id = "name",j = "numbers",value.var.prefix = "value")
widedata

        name     value1     value2     value3     value4
   firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
  secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
如果要从宽变长,请仅将宽变长,而不更改对象

reshape_toLong(data = widedata,id = "name",j = "numbers",value.var.prefix = "value")

        name numbers      value
   firstName       1  0.3407997
  secondName       1 -0.8981073
   firstName       2 -0.7033403
  secondName       2 -0.3347941
   firstName       3 -0.3795377
  secondName       3 -0.5013782
   firstName       4 -0.7460474
  secondName       4 -0.1745357

+1而且您不需要依赖外部软件包,因为
restrape
附带
stats
。更不用说它更快了!=)@indra_patil-我可能会使用其他答案中所示的重塑2包。您可以创建一个特定于您的用例的新问题,如果您无法解决它,可以将其发布。
重塑
是可怕函数API的一个突出例子。它几乎是无用的。
重塑
注释和类似的参数名称并没有多大帮助。但是,我发现从长到宽,您需要提供
data=
您的data.frame,
idvar
=标识组的变量,
v.names
=将成为宽格式多列的变量,
timevar
=包含将以宽格式添加到
v.names
的值、
direction=wide
sep=“\u”
的变量。够清楚吗?;)我会说