问题描述
假设我有以下数据框:
df = data.frame(Value = rnorm(16,1),stringsAsFactors = F)
我想重塑这一列以获得 4 列,其中 df
的前 4 行是新 df 的第一行,从 5 到 8 的行是新 df 的第二行等
所需的输出将是:
# original random data
Value
1 0.91252514
2 0.54858410
3 0.60361002
4 -0.36479957
5 -0.57253378
6 -0.64271622
7 1.06519500
8 1.49557598
9 0.51933447
10 1.04606789
11 0.13745408
12 0.43722826
13 -0.01168782
14 -0.50464089
15 -0.82506265
16 -1.04228086
# desired output
Col1 Col2 Col3 Col4
1 0.91252514 0.54858410 0.60361002 -0.36479957
2 -0.57253378 -0.64271622 1.06519500 1.49557598
3 0.51933447 1.04606789 0.13745408 0.43722826
4 -0.01168782 -0.50464089 -0.82506265 -1.04228086
我试过了,但我无法得到我需要的东西:
library(tidyr)
df2 = cbind(data.frame(Group= rep(c(1,2,3,4),length(df)/4),stringsAsFactors = F),df)
df2 %>% separate(Group,c("Beta","SE","t","p"))
有人可以帮我吗?
谢谢!
解决方法
如果需要的行数是 'df' 中总行数的倍数,则使用 matrix
更容易
as.data.frame( matrix(df$Value,4,byrow = TRUE))
,
这里有一些其他的基本 R 选项
> data.frame(t(array(df$Value,c(4,4))))
X1 X2 X3 X4
1 0.91252514 0.5485841 0.6036100 -0.3647996
2 -0.57253378 -0.6427162 1.0651950 1.4955760
3 0.51933447 1.0460679 0.1374541 0.4372283
4 -0.01168782 -0.5046409 -0.8250627 -1.0422809
> data.frame(do.call(rbind,split(df$Value,ceiling(seq(nrow(df)) / 4))))
X1 X2 X3 X4
1 0.91252514 0.5485841 0.6036100 -0.3647996
2 -0.57253378 -0.6427162 1.0651950 1.4955760
3 0.51933447 1.0460679 0.1374541 0.4372283
4 -0.01168782 -0.5046409 -0.8250627 -1.0422809
或(感谢@akrun 的评论)
t("dim<-"(t(df),4)))
,
使用pivot_wider
:
library(tidyr)
library(dplyr)
df %>% mutate(id= rep(c(1:4),length.out = nrow(.))) %>%
pivot_wider(names_from = id,values_from = Value,names_prefix = 'Col',values_fn = list ) %>%
unnest(cols = colnames(.))
# A tibble: 4 x 4
Col1 Col2 Col3 Col4
<dbl> <dbl> <dbl> <dbl>
1 0.913 0.549 0.604 -0.365
2 -0.573 -0.643 1.07 1.50
3 0.519 1.05 0.137 0.437
4 -0.0117 -0.505 -0.825 -1.04
,
类似于@Waldi 的方法 -
library(dplyr)
library(tidyr)
df %>%
group_by(id = ceiling(row_number()/4)) %>%
mutate(row = row_number()) %>%
pivot_wider(names_from = row,names_prefix = 'col') %>%
ungroup %>%
select(-id)