0

想象一下,我有以下 tibble 作为我的数据。如您所见,有些列的名称类似于name1.x, 和name2.x,但实际上在我的真实数据集中有数十个。

MWE

test <- tibble(subject = c(1,1,1, 2, 2, 2, 2, 3, 3), 
               name1.x = c(2, 4, 5, 2, 3, 6, 8, 1.2, 10), 
               name2.x = c(1, 6, 8, 1.2, 9, 6, 66, 1.2, 20), 
               visit = factor(c("base", "v1", "v2", "base", "v1", "v2", "v3", "base", "v1")))

  subject name1.x name2.x visit
    <dbl>   <dbl>   <dbl> <fct>
1       1     2       1   base 
2       1     4       6   v1   
3       1     5       8   v2   
4       2     2       1.2 base 
5       2     3       9   v1   
6       2     6       6   v2   
7       2     8      66   v3   
8       3     1.2     1.2 base 
9       3    10      20   v1   

我想要什么?

根据他们的base访问对我的目标列中的值进行重新缩放,当然还可以根据他们的名称创建新列。对应于一个主题的所有v值都应重新调整为它们的对应base值。所以对于主题 1,name1.x第一个值是2并且它恰好是一个基值,所以它必须给我们2/2=1,第二个值是 4 必须给我们4/2=2,依此类推......这些新值必须在一个名称对应的新列中创建对其同源列,name1.x应给出name1.yname2.x-> name2.y。如何使用 tidyverse 实现这一目标?

4

1 回答 1

3

如果我正确阅读了您的问题,我认为以下是解决您问题的一种方法。首先,我使用subject. 对于每个主题,我都按照您的描述处理了部门。基本上,我处理了包含name在列名中的每一列的划分。当我这样做时,我使用了base与分母在同一行中的值。最后,我修改了列名,以便获得所需的列名。我希望这能帮到您。

library(dplyr)

group_by(test, subject) %>% 
  mutate_at(vars(contains("name")),
            .funs = list(y = ~./.[visit == "base"])) %>% 
  rename_at(vars(contains("_")),
            .funs = list(~sub(x = ., pattern = "(?<=.)._", replacement = "", perl = TRUE)))

#  subject name1.x name2.x visit name1.y name2.y
#    <dbl>   <dbl>   <dbl> <fct>   <dbl>   <dbl>
#1       1     2       1   base     1        1  
#2       1     4       6   v1       2        6  
#3       1     5       8   v2       2.5      8  
#4       2     2       1.2 base     1        1  
#5       2     3       9   v1       1.5      7.5
#6       2     6       6   v2       3        5  
#7       2     8      66   v3       4       55  
#8       3     1.2     1.2 base     1        1  
#9       3    10      20   v1       8.33    16.7
于 2019-12-28T11:47:27.650 回答