微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 R 中将一列数据框重塑为 4 列?

如何解决如何在 R 中将一列数据框重塑为 4 列?

假设我有以下数据框:

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。