【问题标题】:In R, how to stack/rbind every N columns using dplyr?在 R 中,如何使用 dplyr 堆叠/绑定每 N 列?
【发布时间】:2021-03-16 12:33:39
【问题描述】:

我想知道是否有人可以帮助我将较长的行分成几行较短的行,然后将它们拆开?

  1. 在此示例中,我有 12 列长的行,我希望将其分成更多行 à 4 列(请参阅 stack_df)。
  2. 总体计划是,然后按行方式将所有列 unite() 并将 mutate() 转换为一列(9 行 x 1 列,请参阅 merge_df)。
  3. 之后,我希望将它们解压成一个大小为 3 行 3 列的数据框(参见 simple_df。)

第 1 部分(1/2):

> df <- matrix(c("A", "B", "C"),nrow=3,ncol=12,byrow=F)
> df
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] "A"  "A"  "A"  "A"  "A"  "A"  "A"  "A"  "A"  "A"   "A"   "A"  
[2,] "B"  "B"  "B"  "B"  "B"  "B"  "B"  "B"  "B"  "B"   "B"   "B"  
[3,] "C"  "C"  "C"  "C"  "C"  "C"  "C"  "C"  "C"  "C"   "C"   "C"

第 1 部分(2/2):

> stack_df <- matrix(c(rep("A",3), rep("B",3), rep("C",3)), nrow = 9, ncol = 4) 
> stack_df
      [,1] [,2] [,3] [,4]
 [1,] "A"  "A"  "A"  "A" 
 [2,] "A"  "A"  "A"  "A" 
 [3,] "A"  "A"  "A"  "A" 
 [4,] "B"  "B"  "B"  "B" 
 [5,] "B"  "B"  "B"  "B" 
 [6,] "B"  "B"  "B"  "B" 
 [7,] "C"  "C"  "C"  "C" 
 [8,] "C"  "C"  "C"  "C" 
 [9,] "C"  "C"  "C"  "C"

第二部分:unite()、mutate()、case_when()

    > merge_df <- stack_df %>% 
+   as.data.frame(.) %>% 
+   unite(stack_df, 1:4, na.rm = T) %>% 
+   print()
  stack_df
1  A_A_A_A
2  A_A_A_A
3  A_A_A_A
4  B_B_B_B
5  B_B_B_B
6  B_B_B_B
7  C_C_C_C
8  C_C_C_C
9  C_C_C_C

这里有一个mutate(),case_when()过程。

> mutate_df <- cbind(sample(letters,9)) %>% 
+   print()
      [,1]
 [1,] "w" 
 [2,] "q" 
 [3,] "t" 
 [4,] "p" 
 [5,] "r" 
 [6,] "k" 
 [7,] "i" 
 [8,] "o" 
 [9,] "d"

第 3 部分:取消堆叠行(到 3 行,3 列)。 (期望的输出)

> simple_df <- matrix(mutate_df, nrow = 3, ncol=3, byrow = T)
> simple_df
     [,1] [,2] [,3]
[1,] "w"  "q"  "t" 
[2,] "p"  "r"  "k" 
[3,] "i"  "o"  "d" 

【问题讨论】:

  • 你知道tidyr::separate_rows()

标签: r dplyr


【解决方案1】:

该问题将输入 df 命名为好像它是一个数据框,但它是一个矩阵,并且 dplyr 通常用于数据框而不是矩阵。 dplyr 可能不是在这里使用的正确工具,而是使用这个基本的 R 单线,我们在最后使用 Note 中的输入 m 使用更准确的名称,并更改内容以使结果明确。

matrix(t(m), ncol = 4, byrow = TRUE)

给予:

      [,1] [,2]  [,3]  [,4] 
 [1,] "A1" "A2"  "A3"  "A4" 
 [2,] "A5" "A6"  "A7"  "A8" 
 [3,] "A9" "A10" "A11" "A12"
 [4,] "B1" "B2"  "B3"  "B4" 
 [5,] "B5" "B6"  "B7"  "B8" 
 [6,] "B9" "B10" "B11" "B12"
 [7,] "C1" "C2"  "C3"  "C4" 
 [8,] "C5" "C6"  "C7"  "C8" 
 [9,] "C9" "C10" "C11" "C12"

或者如果您希望 A 逐列填写前 3 行,B 和 C 也是如此

matrix(aperm(array(t(m), c(3, 4, 3)), c(1, 3, 2)), ncol = 4)

给予:

      [,1] [,2] [,3] [,4] 
 [1,] "A1" "A4" "A7" "A10"
 [2,] "A2" "A5" "A8" "A11"
 [3,] "A3" "A6" "A9" "A12"
 [4,] "B1" "B4" "B7" "B10"
 [5,] "B2" "B5" "B8" "B11"
 [6,] "B3" "B6" "B9" "B12"
 [7,] "C1" "C4" "C7" "C10"
 [8,] "C2" "C5" "C8" "C11"
 [9,] "C3" "C6" "C9" "C12"

上面的两个单行代码可以用这样的管道来编写:

library(magrittr)

m %>% t %>% matrix(m, ncol = 4, byrow = TRUE)

m %>% t %>% array(c(3, 4, 3)) %>% aperm(c(1, 3, 2)) %>% matrix(ncol = 4)

注意

m0 <- matrix(c("A", "B", "C"), 3, 12)
m <- replace(m0, TRUE, paste0(m0, col(m)))
m

给予:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" "A10" "A11" "A12"
[2,] "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9" "B10" "B11" "B12"
[3,] "C1" "C2" "C3" "C4" "C5" "C6" "C7" "C8" "C9" "C10" "C11" "C12"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2017-04-29
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2019-08-27
    相关资源
    最近更新 更多