繁体   English   中英

如何在 R 中将一列 dataframe 重塑为 4 列?

[英]How can I reshape one column dataframe into 4 columns in R?

假设我有以下 dataframe:

df = data.frame(Value = rnorm(16,0,1), stringsAsFactors = F)

我想重塑这个单列以获得 4 列,其中 df 的前 4 行是新df的第一行,从 5 到 8 的行是新 df 的第二行,等等。

所需的 output 将是:

# 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, 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), c(4, 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, values_from = Value, names_prefix = 'col') %>%
  ungroup %>%
  select(-id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM