2

已经提出了类似的问题,但它们都指在一个关键列中收集多个列。

我需要两个键中的多个列。

这是我拥有的数据框:

ID ... 测量_A.1 测量_A.2 测量_B.1 测量_B.2
1 8.25 23.5 4 5
2 8.6 22.5 3 4

如果我使用以下代码,我会得到:

 df %>% 
 gather(key = measure_A, value = "score_A", measure_A.1, measure_A.2) %>%
 gather(key = measure_B, value = "score_B", measure_B.1, measure_B.2)
 
ID ... measure_A score_A measure_B score_B
1 测量_A.1 8.25 测量_B.1 4   
1 测量_A.1 8.25 测量_B.1 4
1 测量_A.2 23.5 测量_B.2 5
1 测量_A.2 23.5 测量_B.2 5
2 测量_A.1 8.6 测量_B.1 3
2 测量_A.1 8.6 测量_B.1 3
2 测量_A.2 22.5 测量_B.2 4
2 测量_A.2 22.5 测量_B.2 4

我想要的是这个:

ID ... measure_A score_A measure_B score_B
1 测量_A.1 8.25 测量_B.1 4   
1 测量_A.2 23.5 测量_B.2 5
2 测量_A.1 8.6 测量_B.1 3
2 测量_A.2 22.5 测量_B.2 4

在我看来,我必须减少一些东西,但我不知道如何结合收集命令来做到这一点。我找到了一个带有过滤器的解决方案,但我不明白它是如何工作的。

4

1 回答 1

2

这会以长格式提供所需的数据以及所有值。

library(tidyverse)

df %>%
  pivot_longer(cols = -ID, 
               names_to = c('.value', 'num'),
               names_sep = '\\.') 

#     ID num   measure_A measure_B
#  <int> <chr>     <dbl>     <int>
#1     1 1          8.25         4
#2     1 2         23.5          5
#3     2 1          8.6          3
#4     2 2         22.5          4

之后,我们需要进行一些操作以获得确切的所需输出。

df %>%
  pivot_longer(cols = -ID, 
               names_to = c('.value', 'num'),
               names_sep = '\\.') %>%
  rename_with(~sub('measure', 'score', .), starts_with('measure')) %>%
  mutate(measure_A = str_c('MeasureA', num, sep = '.'), 
         measure_B = str_c('MeasureB', num, sep = '.')) %>%
  select(-num)

#     ID score_A score_B measure_A  measure_B 
#  <int>   <dbl>   <int> <chr>      <chr>     
#1     1    8.25       4 MeasureA.1 MeasureB.1
#2     1   23.5        5 MeasureA.2 MeasureB.2
#3     2    8.6        3 MeasureA.1 MeasureB.1
#4     2   22.5        4 MeasureA.2 MeasureB.2
于 2021-08-25T13:30:09.123 回答