R语言 如何将列与多行合并

ndasle7k  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(125)

我有一个 Dataframe ,看起来类似于下面的内容

Sex <- c("F", "F", "M", "M", "F")
Phenotype <- c("Control", "Experimental", "Experimental", "Control", "Control")
MOp_Amygdala <- c(10, 15, 2, 10, 8)
MOp_Thalamus <- c(11, 16, 3, 11, 9)
MOp_Cerebellum <- c(9, 14, 1, 9, 7)
MOq_Cortex <- c(8, 11, 1, 8, 6)
MOq_Striatum  <- c(6, 9 , 8, 6, 8)

df <- data.frame(Sex, Phenotype, MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum, MOq_Cortex, MOq_Striatum)

字符串
我想把所有以MOp开始的列折叠成一个单独的列,称为“初级运动皮层”。
这是我到目前为止所拥有的:

temp <- df %>% 
  unite(col="Primary_Motor_Cortex", MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum)


从技术上讲,这实现了我想要的,但它的可读性不是很好,因为样本的所有值都进入了 Dataframe 的同一个单元格。理想情况下,我希望每个值都进入自己的行,复制每个相应的性别和表型。
我理解这意味着剩下的两列,Moq_Cortex和MOq_Striatum,将有一些空单元格,但我对此没有意见。
这是我想要的最终输出。因为列“初级运动皮层”将有更多的行,其他两列将有一些空白单元格。


的数据

c0vxltue

c0vxltue1#

我相信期望的输出可能不如一些“更整洁”的解决方案有用。如果所有行都表示唯一的观察结果,并且我们只想聚合“初级运动皮层”信息,如果我们创建一个列表列,我们可能会得到更多可操作的结果:

df <- df |> 
    rowwise() |> 
    mutate(primary_motor_cortex = list(pick(starts_with("MOp"))),
           .keep = "unused"
           )

df
# A tibble: 5 × 5
# Rowwise: 
  Sex   Phenotype    MOq_Cortex MOq_Striatum primary_motor_cortex
  <chr> <chr>             <dbl>        <dbl> <list>              
1 F     Control               8            6 <tibble [1 × 3]>    
2 F     Experimental         11            9 <tibble [1 × 3]>    
3 M     Experimental          1            8 <tibble [1 × 3]>    
4 M     Control               8            6 <tibble [1 × 3]>    
5 F     Control               6            8 <tibble [1 × 3]>

字符串
我们可以很容易地访问“primary_motor_cortex”列:

df$primary_motor_cortex
[[1]]
# A tibble: 1 × 3
  MOp_Amygdala MOp_Thalamus MOp_Cerebellum
         <dbl>        <dbl>          <dbl>
1           10           11              9

[[2]]
# A tibble: 1 × 3
  MOp_Amygdala MOp_Thalamus MOp_Cerebellum
         <dbl>        <dbl>          <dbl>
1           15           16             14

[[3]]
# A tibble: 1 × 3
  MOp_Amygdala MOp_Thalamus MOp_Cerebellum
         <dbl>        <dbl>          <dbl>
1            2            3              1

[[4]]
# A tibble: 1 × 3
  MOp_Amygdala MOp_Thalamus MOp_Cerebellum
         <dbl>        <dbl>          <dbl>
1           10           11              9

[[5]]
# A tibble: 1 × 3
  MOp_Amygdala MOp_Thalamus MOp_Cerebellum
         <dbl>        <dbl>          <dbl>
1            8            9              7

z6psavjg

z6psavjg2#

您可以使用pivot_longer(具有某些规范)和mutate/distinct(假设您希望对折叠列中的值求和):

df %>% pivot_longer(matches("Thal|Cort|Amy"), 
                    values_to = "primary_motor_cortex", 
                    names_to = NULL) %>%
  group_by(across(-primary_motor_cortex)) %>%
  mutate(primary_motor_cortex = sum(primary_motor_cortex)) %>%
  distinct()

字符串
输出量

Sex   Phenotype    MOp_Cerebellum MOq_Striatum primary_motor_cortex
  <chr> <chr>                 <dbl>        <dbl>                <dbl>
1 F     Control                   9            6                   29
2 F     Experimental             14            9                   42
3 M     Experimental              1            8                    6
4 M     Control                   9            6                   29
5 F     Control                   7            8                   23

相关问题