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'))