我有一个像这样的数据框:
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")
答案 0 :(得分:3)
您可以使用内置的颜色数据集或为您的案例创建自定义数据集。我在这里使用自定义名称创建color_name
。
我们可以使用Visit_Group
检查endsWith
的最后一个字符。然后,我们使用match
和unique
为每个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