Мне предоставили большой набор данных, который имел очень сложный набор метаданных.Все манипулирование было выполнено с использованием инструментов Tidyverse, таких как janitor, dplyr и т. Д. Но чтобы добавить возраст и пол к основному набору, я прибег к небольшой петле типа:
tbl$age <- NA
for (i in 1:nrow(tbl)) {
if (is.na(tbl$age[i])) {
a <- tbl$id[i]
b <- as.character(metadata[match(a,metadata$id),c("age")])
tbl$age[i] <- as.numeric(b)
}
}
Пожалуйста, обратитесьна MWE:
metadata <- tribble(
~id, ~gender, ~age,
"AA1001", "male", 3.6,
"BB2191", "female", 8.5
)
tbl <- tribble(
~id, ~B, ~C,
"AA1001", 0, 2,
"AA1001", 24, 2,
"AA9798", 0, 0,
"AA1007", 0, 2,
"AA1007", 24, 2,
"AA1007", 48, 2,
"AA1025", 0, 2,
"AA1025", 24, 2,
"AA1025", 48, 2,
"AA4405", 0, 0,
"AA6683", 0, 0,
"BB4498", NA, 0,
"BB2191", 0, 0,
"AA1086", 0, 0,
"AA1086", 24, 0,
"AA1086", 48, 0,
"AA8352", 0, 0,
)
- Можно ли достичь того же результата, что и в малом цикле for, но используя манипуляцию строк с мурлыканьем или другим инструментом в пределах тидиверса?
Ожидаемый результат:
> tbl
# A tibble: 17 x 4
id B C age
<chr> <dbl> <dbl> <dbl>
1 AA1001 0 2 3.6
2 AA1001 24 2 3.6
3 AA9798 0 0 NA
4 AA1007 0 2 NA
5 AA1007 24 2 NA
6 AA1007 48 2 NA
7 AA1025 0 2 NA
8 AA1025 24 2 NA
9 AA1025 48 2 NA
10 AA4405 0 0 NA
11 AA6683 0 0 NA
12 BB4498 NA 0 NA
13 BB2191 0 0 8.5
14 AA1086 0 0 NA
15 AA1086 24 0 NA
16 AA1086 48 0 NA
17 AA8352 0 0 NA