R语言 通过示例重塑数据框

ilmyapht  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(84)

我正在尝试重塑我的数据框架,我的数据在很长的列中,我需要将这些数据分散到同一行但新的列中,正如你在上面看到的。
我遇到的主要问题之一是创建新列。我最终将创建近300个新列。在我的确切问题中,我将有A1,A2,一直到A23,与其他变量一样,所以手动初始化列似乎不可行。
有没有一种方法,我可以循环或可能使这一功能,以创建列和重塑我的数据框?

| Column A | Column B | 
| -------- | -------- | 
| Cell 1   | Cell 2   |
| Cell 3   | Cell 4   |
| Cell 5   | Cell 6   |

| Column A | Column B | Column A1 | Column B1 | Column A2| Column B2|
| -------- | -------- | --------- | --------- | ---------| ---------|
| Cell 1   | Cell 2   |  Cell 3   |  Cell 4   | Cell 5   |  Cell 6  |

df$A1 <- NA #Initializing the new column 

df$A1[1] <- df$A[2] #Setting the value in A row 2, to A1 row 1.

字符串

jtw3ybtb

jtw3ybtb1#

我们可以这样做。主要功能是创建一个id列,并在旋转成长格式后进行分组:

library(dplyr)
library(tidyr)

df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(-id) %>% 
  mutate(name = paste(name, id), .keep = "unused") %>% 
  pivot_wider(names_from = name, values_from = value)

个字符
示例数据:

df <- structure(list(ColA = c("Cell 1", "Cell 3", "Cell 5"), ColB = c("Cell 2", 
"Cell 4", "Cell 6")), class = "data.frame", row.names = c(NA, 
-3L))

yvt65v4c

yvt65v4c2#

为了在生成一定数量的列之后创建多行,我们需要为pivot_wider()建立一个行标识符,这是我最初对OP的评论的基础。为了说明这个概念,我们将为每列输入数据创建一个具有已知数量的复制(1 - n)的 Dataframe ,并使用复制计数来分配一个行标识符。
我们首先为2个变量创建5个副本,并将它们转换为列名为A 1 - A 5和B 1 - B 5的格式,其中有50个数据元素,在pivot_wider()操作后,我们最终得到5行10列。
首先,我们创建一些数据,其中每个单元格都是一个唯一的序列号,这样我们就可以看到数据元素是如何跨列分布的。

replicate_count <- 5
column_count <- 2
x <- data.frame(matrix(1:(replicate_count * 10),ncol = column_count,byrow = TRUE))
colnames(x) <- c("A","B")
x$var_id <- rep(1:replicate_count,nrow(x) / replicate_count)
x$row_id <- rep(1:replicate_count,each = replicate_count)

字符串
前几行看起来像这样:

> head(x)
   A  B var_id row_id
1  1  2      1      1
2  3  4      2      1
3  5  6      3      1
4  7  8      4      1
5  9 10      5      1
6 11 12      1      2


接下来,我们将轴旋转得更长,以将列名与值分离,将列名与复制标识符组合,并使用row_id定义行。

library(tidyr)
library(dplyr)
x %>% pivot_longer(cols = A:B) %>%
     mutate(var_name = paste(name,var_id)) %>% 
     select(var_name,value,row_id) %>% 
     pivot_wider(names_from = var_name,id_cols=row_id)


. and the output:

row_id `A 1` `B 1` `A 2` `B 2` `A 3` `B 3` `A 4` `B 4` `A 5` `B 5`
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1      1     1     2     3     4     5     6     7     8     9    10
2      2    11    12    13    14    15    16    17    18    19    20
3      3    21    22    23    24    25    26    27    28    29    30
4      4    31    32    33    34    35    36    37    38    39    40
5      5    41    42    43    44    45    46    47    48    49    50


这个解决方案的技巧是在rep()函数中使用each =参数来创建row_id。而不是复制1:5 5 5次,each =参数允许我们创建5个1,然后5个2,等等。这种顺序提供了正确的输入,将row_id用作pivot_wider()中的id_col
如果我们将var_idrow_id的创建移动到tidyverse管道中,完整的解决方案如下所示:

replicate_count <- 5
column_count <- 2
x <- data.frame(matrix(1:(replicate_count * 10),ncol = column_count,byrow = TRUE))
colnames(x) <- c("A","B")
library(tidyr)
library(dplyr)
x %>% 
     mutate(var_id = rep(1:replicate_count,(nrow(x) / replicate_count)),
            row_id = rep(1:replicate_count,each = replicate_count)) %>% 
     pivot_longer(cols = A:B) %>%
     mutate(var_name = paste(name,var_id)) %>% 
     select(var_name,value,row_id) %>% 
     pivot_wider(names_from = var_name,id_cols=row_id)

相关问题