R 旋转多列

R 旋转多列,r,tidyverse,tidyr,R,Tidyverse,Tidyr,如果我有一个如下所示的数据表: 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),

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

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和1是相关的,b和2是相关的,c和3是相关的(例如,字母是日期,数字是在该日期进行的测量)

有没有人知道如何旋转更长的轴,这样我就有了一个带有两列的df

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

非常感谢

似乎您想要的不是
pivot\u longer
,而是
select
bind\u 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))
结合使用
选择
绑定行

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 

a%
选择(一,一)%>%
重命名(“字母”=a,“数字”=1)
b%
选择(b,两个)%>%
重命名(“字母”=b,“数字”=2)
c%
选择(c,三个)%>%
重命名(“字母”=c,“数字”=3)
d%
绑定_行(b)%>%
绑定行(c)
D
#一个tibble:15x2
字母号
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 

假设您总是有偶数列,因为两列总是相关的,您可以
一次取消列出
半个数据帧以获得两列

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

<代码> N< P>一个通过R基础的想法是在中间分割数据帧,<代码>堆栈两个结果数据框并将它们绑定在一起。
setNames(do.call(cbind, 
            lapply(split.default(d2, rep(c(FALSE, TRUE), each = (ncol(d2) / 2))), function(i) stack(i)[1])), 
        c('letter', 'value'))

这回答了你的问题吗?相关规范:
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))
setNames(do.call(cbind, 
            lapply(split.default(d2, rep(c(FALSE, TRUE), each = (ncol(d2) / 2))), function(i) stack(i)[1])), 
        c('letter', 'value'))