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