R 将长数据表重塑为宽数据表列表

R 将长数据表重塑为宽数据表列表,r,data.table,reshape,R,Data.table,Reshape,我的问题是这里提出的问题的扩展 因此,我将用类似的方式表达它 不同之处在于我想将一个长数据表重新排列成一个宽数据表的列表 dat <- data.table( sim = rep(c(1,2), each=4), time = rep(1:4, 2), value1 = rnorm(8), value2 = rnorm(8) ) dat sim time value1 value2 1 1 1 0.340

我的问题是这里提出的问题的扩展 因此,我将用类似的方式表达它

不同之处在于我想将一个长数据表重新排列成一个宽数据表的
列表

dat <- data.table(
    sim = rep(c(1,2), each=4),
    time = rep(1:4, 2),
    value1 = rnorm(8),
    value2 = rnorm(8)
    )

dat
   sim  time      value1  value2
1    1     1      0.3407  0.5167
2    1     2     -0.7033  0.8416
3    1     3     -0.3795 -0.4717
4    1     4     -0.7460  0.8479
5    2     1      0.8981 -0.7163
6    2     2     -0.3347 -0.6849
7    2     3      0.5013  0.8941
8    2     4     -0.1745  0.0795


我的解决方案是创建一个嵌套的结果数据框架。我提供了一个reprex所遵循的方法的简要描述

我可以通过使用
pivot\u-witter()
pivot\u-longer()
来重塑数据<首先使用“代码>轴”\u longer
使每行仅包含1个值,并带有时间、模拟以及值是1还是2的标签。然后使用
pivot\u wide
每行将包含每次的值,并带有模拟标签以及它们是哪组值。(值1或值2)

最后,我们使用
nest
来嵌套数据帧,它在数据帧中存储每组值的所有数据。如有必要,如果嵌套的VAL是我们将嵌套数据帧分配给的对象,则可通过
nested\u vals$data
将其作为数据帧数组进行访问

库(tidyverse)
#设置数据
dat%
#将数据的名称移动到数据帧的开头
重新定位(名称)%>%
#按要求将数据透视到矩阵形式(即时间作为列,SIM作为行)
pivot\u-wide(id\u-cols=c(name,sim),name\u-from=time,values\u-from=value)%>%
#按名称嵌套结果
嵌套(-name)
#>警告:“…”的所有元素都必须命名。
#>你想要'data=c(sim,'1','2','3','4')吗?
嵌套变量
#>#tibble:2x2
#>名称数据
#>                   
#>1价值1
#>2价值2
嵌套的_vals$数据[[2]]
#>#A tible:2 x 5
#>sim`1``2``3``4`
#>              
#> 1     1  0.0639 0.250    -1.28   0.850
#> 2     2 -1.90   0.000421  0.704 -0.164

由(v2.0.0)于2021-04-07创建的tidyverse解决方案可以是:

library(dplyr)
library(purrr)
library(tidyr)

dat_longer <- dat %>%
  tidyr::pivot_longer(starts_with("value"), names_to="col_name", values_to="values")

list_wide <- purrr::map(unique(dat_longer[["col_name"]]),
                         ~dat_longer %>%
                           dplyr::filter(col_name==.x) %>%
                           tidyr::pivot_wider(values_from = "values", names_from="time") %>% 
                           select(-col_name)) %>% 
  purrr::set_names(unique(dat_longer[["col_name"]]))

$value1
# A tibble: 2 x 5
    sim    `1`    `2`    `3`    `4`
  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1     1 -0.710 -0.334 -0.370  0.777
2     2  0.130  0.877  1.24  -0.202

$value2
# A tibble: 2 x 5
    sim    `1`    `2`    `3`    `4`
  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1     1 -0.719 -0.909 0.0821 -0.158
2     2 -0.706  1.51  0.234   1.09 
库(dplyr)
图书馆(purrr)
图书馆(tidyr)
dat_更长%
tidyr::pivot_更长(以“值”开头),名称到=“col_name”,值到=“values”)
列表范围%
dplyr::筛选器(列名称==.x)%>%
tidyr::pivot_加宽(value_from=“values”,name_from=“time”)%>%
选择(-col_name))%>%
purrr::设置名称(唯一(dat\U更长[[“列名称”]]))
$value1
#一个tibble:2x5
sim`1``2``3``4`
1     1 -0.710 -0.334 -0.370  0.777
2     2  0.130  0.877  1.24  -0.202
$value2
#一个tibble:2x5
sim`1``2``3``4`
1     1 -0.719 -0.909 0.0821 -0.158
2     2 -0.706  1.51  0.234   1.09 
两种变体

数据表
库(data.table)
tmp%
熔体(,id=c(“sim”,“时间”))%>%
dcast(,sim+变量~时间)%>%
拆分(,.$变量)%>%
lapply(,set,i=NULL,j=“变量”,value=NULL)
#$value1
#模拟1 2 3 4
#                               
# 1:     1  1.0458737762 -0.4845954  0.1891288 0.05100633
# 2:     2 -0.0002406689  1.8093820 -0.8253280 1.14547045
#$value2
#模拟1 2 3 4
#                             
# 1:     1  0.03157319 -0.8352058 -0.06876365 0.7467717
# 2:     2 -0.42551873 -0.7720822  0.15276411 0.9885968
三角帆
库(dplyr)
图书馆(三年)#支点长,支点宽
dat%>%
轴长(,-c(模拟,时间))%>%
枢轴宽度(,名称从=时间,值从=值)%>%
拆分(,.$name)%>%
lapply(,选择,-名称)
#$value1
##A tible:2 x 5
#sim`1``2``3``4`
#              
# 1     1  1.05     -0.485  0.189 0.0510
# 2     2 -0.000241  1.81  -0.825 1.15  
#$value2
##A tible:2 x 5
#sim`1``2``3``4`
#            
# 1     1  0.0316 -0.835 -0.0688 0.747
# 2     2 -0.426  -0.772  0.153  0.989

还有一种方法,使用单管道语法

library(tidyverse)
dat %>% pivot_longer(c(value1, value2)) %>%
  group_split(name) %>% setNames(map(., ~.x[[3]][1])) %>%
  map(~ .x %>% pivot_wider(id_cols = sim, names_from = time, values_from = value))

$value1
# A tibble: 2 x 5
    sim    `1`     `2`    `3`    `4`
  <dbl>  <dbl>   <dbl>  <dbl>  <dbl>
1     1 -0.851 -0.0484 -0.656 -0.121
2     2 -0.645  1.59   -0.274  0.445

$value2
# A tibble: 2 x 5
    sim   `1`    `2`    `3`   `4`
  <dbl> <dbl>  <dbl>  <dbl> <dbl>
1     1  1.46 -1.62  -0.672 1.43 
2     2  1.65  0.790  0.495 0.162

库(tidyverse)
数据%>%pivot_更长(c(值1,值2))%>%
组分割(名称)%%>%setNames(映射(,~.x[[3]][1]))%%>%
映射(~.x%>%pivot\u更宽(id\u cols=sim,name\u from=time,values\u from=value))
$value1
#一个tibble:2x5
sim`1``2``3``4`
1     1 -0.851 -0.0484 -0.656 -0.121
2     2 -0.645  1.59   -0.274  0.445
$value2
#一个tibble:2x5
sim`1``2``3``4`
1     1  1.46 -1.62  -0.672 1.43 
2     2  1.65  0.790  0.495 0.162
另一种方法:

library(dplyr)
library(tidyr)
wide_dat <- dat %>% pivot_wider(id_cols = sim, names_from = time, values_from = starts_with('value'))
lapply(lapply(split.default(wide_dat[-1], sub('_\\d','',names(wide_dat[-1]))), function(x) cbind(wide_dat[1],x)), setNames, c('sim', 1:4))
$value1
  sim          1         2        3         4
1   1 -0.1704969 0.2820143 1.181898 2.2377396
2   2  2.1920534 0.8214070 0.421177 0.7601796

$value2
  sim          1         2          3          4
1   1  0.1760887 0.3440053 -0.8435849  0.6729751
2   2 -0.1714095 1.5125986 -0.5739871 -0.9648294
库(dplyr)
图书馆(tidyr)
宽数据%pivot宽(id\u cols=sim,names\u from=time,values\u from=start\u with('value'))
lappy(lappy(split.default)(宽数据[-1],子('''\\\d','',名称(宽数据[-1])),函数(x)cbind(宽数据[1],x)),集合名,c('sim',1:4))
$value1
模拟1 2 3 4
1   1 -0.1704969 0.2820143 1.181898 2.2377396
2   2  2.1920534 0.8214070 0.421177 0.7601796
$value2
模拟1 2 3 4
1   1  0.1760887 0.3440053 -0.8435849  0.6729751
2   2 -0.1714095 1.5125986 -0.5739871 -0.9648294

标签有点模棱两可;您是否打算使用(R的
data.table
package)?如果不是,那么这个标签不适合这个问题,可能更适合R的框架。我使用的是data.table包,是的。我在代码中错误地使用了数据帧,谢谢(你可以看到大量基于dplyr的答案,这造成了很大的不同:-)我从来没有想到dcast!非常简洁的解决方案两件事:这里的诀窍是双重重塑(更长,然后更宽);和
dcast
/
melt
类似于
pivot\u longer
/
pivot\u wide
中的
tidyr
fame。很高兴它对你有用。
library(dplyr)
library(tidyr)
wide_dat <- dat %>% pivot_wider(id_cols = sim, names_from = time, values_from = starts_with('value'))
lapply(lapply(split.default(wide_dat[-1], sub('_\\d','',names(wide_dat[-1]))), function(x) cbind(wide_dat[1],x)), setNames, c('sim', 1:4))
$value1
  sim          1         2        3         4
1   1 -0.1704969 0.2820143 1.181898 2.2377396
2   2  2.1920534 0.8214070 0.421177 0.7601796

$value2
  sim          1         2          3          4
1   1  0.1760887 0.3440053 -0.8435849  0.6729751
2   2 -0.1714095 1.5125986 -0.5739871 -0.9648294