根据条件和向量对列进行突变

时间:2020-08-24 15:25:55

标签: r dataframe dplyr

我有一个像这样的数据框:

df <- tribble(~ `ProbandID`, ~ `Visit_Group`,
       "1", "V1-B",
       "4", "V2-A",
       "1", "V2-B",
       "2", "V1-A",
       "3", "V2-B",
       "2", "V2-A",
       "4", "V1-A",
       "3", "V1-B")

基本上,这是一个标准的事后测试设计,参与者被随机分配到两个组中,这里是“ A”和“ B”,并且他们的测量是在两次访问(干预前后)进行的,这里是V1和V2

我将它们串联到一个Visit_Group列中。

我现在希望有一个基于颜色值的列,以使任何唯一的ProbandID只有在B分组的一部分和所有{ {1}}通常分配给某种恒定的颜色。在这里,由于进行了两次测试,因此相同的先证者ID会重复两次,我希望它们都具有相同的颜色,以表明它是同一个人。

A

我想出了一个相当精致的答案,任何建议/答案将不胜感激。

我的优雅解决方案:

#Expected output - all A's assigned to a constant colour - black 
# and all the participants in B get a unique colour which is the same across both the visits (`ProbandID` 1 is gold and 3 is green)

df_res <- tribble(~ `ProbandID`, ~ `Visit_Group`, ~ `colors`,
       "1", "V1-B", "gold",
       "4", "V2-A", "black",
       "1", "V2-B", "gold",
       "2", "V1-A", "black",
       "3", "V2-B", "green",
       "2", "V2-A", "black",
       "4", "V1-A", "black",
       "3", "V1-B", "green")

2 个答案:

答案 0 :(得分:3)

您可以使用内置的颜色数据集或为您的案例创建自定义数据集。我在这里使用自定义名称创建color_name

我们可以使用Visit_Group检查endsWith的最后一个字符。然后,我们使用matchunique为每个ProbandID创建一个唯一的索引号,该索引号用于子集color_name。默认情况下,所有“ A”值都会获得第一个索引,即“黑色”颜色。

color_name <- c('Black', 'red', 'blue', 'orange', 'green')

new_df <- df %>%
           mutate(color = color_name[ifelse(endsWith(Visit_Group, 'A'), 1, 
                          match(ProbandID, unique(ProbandID)) + 1)])
new_df
# ProbandID Visit_Group color
#  <chr>     <chr>       <chr>
#1 1         V1-B        red  
#2 4         V2-A        Black
#3 1         V2-B        red  
#4 2         V1-A        Black
#5 3         V2-B        green
#6 2         V2-A        Black
#7 4         V1-A        Black
#8 3         V1-B        green

答案 1 :(得分:2)

无需使用tidyr::separate。可以使用grepl中的base和条件变异来完成;此外,我们需要匹配与颜色关联的ID,以实现正确的匹配,而不仅仅是与唯一条目匹配。

library(dplyr)
color_id <- data.frame(id = c(0, 1, 2, 3, 4),
                       color = c('Black', 'red', 'blue', 'orange', 'green'),
                       stringsAsFactors = F)

df <- tribble(~ `ProbandID`, ~ `Visit_Group`,
              "1", "V1-B",
              "4", "V2-A",
              "1", "V2-B",
              "2", "V1-A",
              "3", "V2-B",
              "2", "V2-A",
              "4", "V1-A",
              "3", "V1-B")
df %>% 
  mutate(color = ifelse(grepl("A", Visit_Group, fixed = TRUE), 
                        color_id[1,2], 
                        color_id[match(ProbandID, color_id$id), 2]))
#>   ProbandID Visit_Group color 
#>   <chr>     <chr>       <chr> 
#> 1 1         V1-B        red   
#> 2 4         V2-A        Black 
#> 3 1         V2-B        red   
#> 4 2         V1-A        Black 
#> 5 3         V2-B        orange
#> 6 2         V2-A        Black 
#> 7 4         V1-A        Black 
#> 8 3         V1-B        orange