收集专栏不重复
Gathering columns without repetition
我正在尝试对齐两组列以便进行比较。收集第一组列,然后收集第二组列会导致重复。
数据:
data <- data.frame(
id=1:4,
q1= 1:4,
q1_1= 5:8,
q2= 9:12,
q2_1= 13:16
)
> data
id q1 q1_1 q2 q2_1
1 1 1 5 9 13
2 2 2 6 10 14
3 3 3 7 11 15
4 4 4 8 12 16
想要的结果:
id key value key2 value2
1 1 q1 1 q2 9
2 2 q1 2 q2 10
3 3 q1 3 q2 11
4 4 q1 4 q2 12
5 1 q1_1 5 q2_1 13
6 2 q1_1 6 q2_1 14
7 3 q1_1 7 q2_1 15
8 4 q1_1 8 q2_1 16
尝试:
data %>% gather(key, value, q1:q1_1) %>%
gather(key2, value2, q2, q2_1)
我们可以使用 reshape_longer
来自 sjmisc
library(sjmisc)
reshape_longer(
data,
columns = list( c("q1", "q1_1"),
c("q2", "q2_1")), names.to = c("key", "key2"),
values.to = c("value", "value2"), id = "id"
)
或在更改 id
列名称后使用 to_long
names(data)[1] <- "ID"
to_long(
data = data,
keys = c("key", "key2"),
values = c("value", "value2"),
c("q1", "q1_1"),
c("q2", "q2_1"))
-输出
ID key value key2 value2
1 1 q1 1 q2 9
2 2 q1 2 q2 10
3 3 q1 3 q2 11
4 4 q1 4 q2 12
5 1 q1_1 5 q2_1 13
6 2 q1_1 6 q2_1 14
7 3 q1_1 7 q2_1 15
8 4 q1_1 8 q2_1 16
将您的数据拆分为多个数据帧,收集并合并 column-wise。
library(tidyr)
library(dplyr)
data <- data.frame(
id=1:4,
q1= 1:4,
q1_1= 5:8,
q2= 9:12,
q2_1= 13:16
)
(d1 <- data %>% select(id, starts_with('q1')) %>% pivot_longer(names_to='key', values_to='value', cols=!id) %>%
arrange(key,id))
(d2 <- data %>% select(id, starts_with('q2')) %>% pivot_longer(names_to='key2', values_to='value2', cols=!id) %>%
arrange(key2,id) %>%
select(!id))
cbind(d1,d2)
这也可以用 pivot_longer
:
library(tidyverse)
data %>%
pivot_longer(cols = c(q1, q1_1), names_to = "key") %>%
pivot_longer(cols = c(q2, q2_1), names_to = "key2", values_to = "value2") %>%
filter(nchar(key) == nchar(key2))
# A tibble: 8 x 5
id key value key2 value2
<int> <chr> <int> <chr> <int>
1 1 q1 1 q2 9
2 1 q1_1 5 q2_1 13
3 2 q1 2 q2 10
4 2 q1_1 6 q2_1 14
5 3 q1 3 q2 11
6 3 q1_1 7 q2_1 15
7 4 q1 4 q2 12
8 4 q1_1 8 q2_1 16
我正在尝试对齐两组列以便进行比较。收集第一组列,然后收集第二组列会导致重复。
数据:
data <- data.frame(
id=1:4,
q1= 1:4,
q1_1= 5:8,
q2= 9:12,
q2_1= 13:16
)
> data
id q1 q1_1 q2 q2_1
1 1 1 5 9 13
2 2 2 6 10 14
3 3 3 7 11 15
4 4 4 8 12 16
想要的结果:
id key value key2 value2
1 1 q1 1 q2 9
2 2 q1 2 q2 10
3 3 q1 3 q2 11
4 4 q1 4 q2 12
5 1 q1_1 5 q2_1 13
6 2 q1_1 6 q2_1 14
7 3 q1_1 7 q2_1 15
8 4 q1_1 8 q2_1 16
尝试:
data %>% gather(key, value, q1:q1_1) %>%
gather(key2, value2, q2, q2_1)
我们可以使用 reshape_longer
来自 sjmisc
library(sjmisc)
reshape_longer(
data,
columns = list( c("q1", "q1_1"),
c("q2", "q2_1")), names.to = c("key", "key2"),
values.to = c("value", "value2"), id = "id"
)
或在更改 id
列名称后使用 to_long
names(data)[1] <- "ID"
to_long(
data = data,
keys = c("key", "key2"),
values = c("value", "value2"),
c("q1", "q1_1"),
c("q2", "q2_1"))
-输出
ID key value key2 value2
1 1 q1 1 q2 9
2 2 q1 2 q2 10
3 3 q1 3 q2 11
4 4 q1 4 q2 12
5 1 q1_1 5 q2_1 13
6 2 q1_1 6 q2_1 14
7 3 q1_1 7 q2_1 15
8 4 q1_1 8 q2_1 16
将您的数据拆分为多个数据帧,收集并合并 column-wise。
library(tidyr)
library(dplyr)
data <- data.frame(
id=1:4,
q1= 1:4,
q1_1= 5:8,
q2= 9:12,
q2_1= 13:16
)
(d1 <- data %>% select(id, starts_with('q1')) %>% pivot_longer(names_to='key', values_to='value', cols=!id) %>%
arrange(key,id))
(d2 <- data %>% select(id, starts_with('q2')) %>% pivot_longer(names_to='key2', values_to='value2', cols=!id) %>%
arrange(key2,id) %>%
select(!id))
cbind(d1,d2)
这也可以用 pivot_longer
:
library(tidyverse)
data %>%
pivot_longer(cols = c(q1, q1_1), names_to = "key") %>%
pivot_longer(cols = c(q2, q2_1), names_to = "key2", values_to = "value2") %>%
filter(nchar(key) == nchar(key2))
# A tibble: 8 x 5
id key value key2 value2
<int> <chr> <int> <chr> <int>
1 1 q1 1 q2 9
2 1 q1_1 5 q2_1 13
3 2 q1 2 q2 10
4 2 q1_1 6 q2_1 14
5 3 q1 3 q2 11
6 3 q1_1 7 q2_1 15
7 4 q1 4 q2 12
8 4 q1_1 8 q2_1 16