【问题标题】:Pivoting multiple columns旋转多个列
【发布时间】:2020-05-22 09:22:59
【问题描述】:

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

a  | b |  c |  one |  two | three
2  | 3 |  4 |  54  |  55  |  45
3  | 6 |  5 |  42  |  23  |  25


tibble::tibble(a = runif(n = 5),
               b = runif(n = 5),
               c = runif(n = 5),
               one = runif(n = 5),
               two = runif(n = 5),
               three = runif(n = 5))

a 和一个相关,b 和两个相关,c 和三个相关(例如,字母是日期,数字是在该日期进行的测量)。

有谁知道如何旋转更长的时间,以便我有一个带有两列的 df,

letter | number
2      | 54
3      | 55
4      | 45
3      | 42
6      | 23
5      | 25

非常感谢!!

【问题讨论】:

标签: r tidyverse tidyr


【解决方案1】:

看来你想要的不是pivot_longer,而是selectbind_rows的组合

library(tidyverse)
set.seed(123)
x <- tibble::tibble(a = runif(n = 5),
               b = runif(n = 5),
               c = runif(n = 5),
               one = runif(n = 5),
               two = runif(n = 5),
               three = runif(n = 5))

pivot_longer 给你这个;这看起来不像你想要的。

x %>% 
  pivot_longer(1:6, names_to = "letter", values_to = "number")

# A tibble: 30 x 2
   letter number
   <chr>   <dbl>
 1 a      0.288 
 2 b      0.0456
 3 c      0.957 
 4 one    0.900 
 5 two    0.890 
 6 three  0.709 
 7 a      0.788 
 8 b      0.528 
 9 c      0.453 
10 one    0.246 
# ... with 20 more rows

使用selectbind_rows 的组合:

a <- x %>% 
  select(a, one) %>% 
  rename("letter" = a, "number" = one)
b <- x %>% 
  select(b, two) %>% 
  rename("letter" = b, "number" = two)
c <- x %>% 
  select(c, three) %>% 
  rename("letter" = c, "number" = three)
d <- a %>% 
  bind_rows(b) %>% 
  bind_rows(c)
d

# A tibble: 15 x 2
   letter number
    <dbl>  <dbl>
 1 0.288  0.900 
 2 0.788  0.246 
 3 0.409  0.0421
 4 0.883  0.328 
 5 0.940  0.955 
 6 0.0456 0.890 
 7 0.528  0.693 
 8 0.892  0.641 
 9 0.551  0.994 
10 0.457  0.656 
11 0.957  0.709 
12 0.453  0.544 
13 0.678  0.594 
14 0.573  0.289 
15 0.103  0.147 

【讨论】:

    【解决方案2】:

    假设你总是有偶数列,因为两列总是相关的,你可以unlist一次半个数据框得到两列。

    n <- ncol(df)/2
    data.frame(letter = unlist(df[1:n]), number = unlist(df[(n+1):ncol(df)]))
    
    #   letter number
    #a1      2     54
    #a2      3     42
    #b1      3     55
    #b2      6     23
    #c1      4     45
    #c2      5     25
    

    数据

    df <- structure(list(a = c(2, 3), b = c(3, 6), c = c(4, 5), one = c(54, 
    42), two = c(55, 23), three = c(45L, 25L)), class = "data.frame", 
    row.names = c(NA, -2L))
    

    【讨论】:

      【解决方案3】:

      base R 的一个想法是在中间拆分数据帧,stack 两个结果数据帧并将它们绑定在一起。

      setNames(do.call(cbind, 
                  lapply(split.default(d2, rep(c(FALSE, TRUE), each = (ncol(d2) / 2))), function(i) stack(i)[1])), 
              c('letter', 'value'))
      

      【讨论】:

        猜你喜欢
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2019-01-02
        • 2021-05-06
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多