【问题标题】:Stacking columns by pair in R在R中成对堆叠列
【发布时间】:2021-01-24 00:15:58
【问题描述】:

id <- rep(c(1, 2, 3, 4), 3)
name <- rep(c("a", "b", "c", "d"), 3)
variable_a <- c(1:4, 9:12, 17:20)
variable_b <- c(5:8, 13:16, 21:24)

test1 <- data.frame(id, name, variable_a, variable_b)

我有一个如下所示的数据集:

id <- c(1, 2, 3, 4)
name <- c("a", "b", "c", "d")
variable_1a <- c(1, 2, 3, 4)
variable_1b <- c(5, 6, 7, 8)
variable_2a <- c(9, 10, 11, 12)
variable_2b <- c(13, 14, 15, 16)
variable_3a <- c(17, 18, 19, 20)
variable_3b <- c(21, 22, 23, 24)

test <- data.frame(id, name, 
                   variable_1a, variable_1b,
                   variable_2a, variable_2b, 
                   variable_3a, variable_3b)


  id name variable_1a variable_1b variable_2a variable_2b variable_3a variable_3b
1  1    a           1           5           9          13          17          21
2  2    b           2           6          10          14          18          22
3  3    c           3           7          11          15          19          23
4  4    d           4           8          12          16          20          24

我正在尝试复制粘贴每对列(1a/1b、2a/2b、3a/3b),同时重复 id 和 names 列。总之,我想要一个这样的数据集:

id <- rep(c(1, 2, 3, 4), 3)
name <- rep(c("a", "b", "c", "d"), 3)
variable_a <- c(1:4, 9:12, 17:20)
variable_b <- c(5:8, 13:16, 21:24)

test1 <- data.frame(id, name, variable_a, variable_b)

   id name variable_a variable_b
1   1    a          1          5
2   2    b          2          6
3   3    c          3          7
4   4    d          4          8
5   1    a          9         13
6   2    b         10         14
7   3    c         11         15
8   4    d         12         16
9   1    a         17         21
10  2    b         18         22
11  3    c         19         23
12  4    d         20         24

我尝试了多种融合和行绑定选项,但我无法让它们以这种列对方式工作。任何想法将是一个有用的命令?谢谢!

【问题讨论】:

标签: r dataframe multiple-columns


【解决方案1】:

reshape 的基本 R 选项

reshape(
  setNames(test,gsub("(\\d)(.)","\\2.\\1",names(test))),
  direction = "long",
  idvar = c("id","name"),
  varying = -(1:2)
)

给予

      id name time variable_a variable_b
1.a.1  1    a    1          1          5
2.b.1  2    b    1          2          6
3.c.1  3    c    1          3          7
4.d.1  4    d    1          4          8
1.a.2  1    a    2          9         13
2.b.2  2    b    2         10         14
3.c.2  3    c    2         11         15
4.d.2  4    d    2         12         16
1.a.3  1    a    3         17         21
2.b.3  2    b    3         18         22
3.c.3  3    c    3         19         23
4.d.3  4    d    3         20         24

【讨论】:

  • 这似乎有效!然而,我很难理解 setNames() 参数在这里做什么,这似乎是把它应用到我的实际数据集的核心。
【解决方案2】:

使用tidyverse 的替代解决方案:

library(tidyverse)
 
test %>% pivot_longer(variable_1a:variable_3b, names_to = c("var_a", "var_b"), names_sep = "_", values_to = "val") %>%
   mutate(c = if_else(var_b %in% c("1a", "2a", "3a"), "var1", "var2")) %>% 
   pivot_wider(c("id", "name"),  names_from = c, values_from = val)  %>%
   unnest(cols = c("var1", "var2"))

# A tibble: 12 x 4
      id name   var1  var2
   <dbl> <chr> <dbl> <dbl>
 1     1 a         1     5
 2     1 a         9    13
 3     1 a        17    21
 4     2 b         2     6
 5     2 b        10    14
 6     2 b        18    22
 7     3 c         3     7
 8     3 c        11    15
 9     3 c        19    23
10     4 d         4     8
11     4 d        12    16
12     4 d        20    24

【讨论】:

    【解决方案3】:

    您拥有的列名 (variable_1a) 和所需的列名 (variable_a) 之间有一个数字 (1)。我们可以从列名中删除该数字,然后使用pivot_longer:

    names(test) <- sub('\\d+', '', names(test))
    
    tidyr::pivot_longer(test, 
                        cols = starts_with('variable'), 
                        names_to = '.value')
    
    #      id name  variable_a variable_b
    #   <dbl> <chr>      <dbl>      <dbl>
    # 1     1 a              1          5
    # 2     1 a              9         13
    # 3     1 a             17         21
    # 4     2 b              2          6
    # 5     2 b             10         14
    # 6     2 b             18         22
    # 7     3 c              3          7
    # 8     3 c             11         15
    # 9     3 c             19         23
    #10     4 d              4          8
    #11     4 d             12         16
    #12     4 d             20         24
    

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2020-06-25
      • 2020-02-06
      • 2012-11-15
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2017-04-29
      相关资源
      最近更新 更多