Операции со строками для сопоставления информации из словаря / метаданных набора данных в основном наборе - PullRequest
1 голос
/ 04 июля 2019

Мне предоставили большой набор данных, который имел очень сложный набор метаданных.Все манипулирование было выполнено с использованием инструментов 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 

1 Ответ

1 голос
/ 04 июля 2019

Это проще сделать с помощью left_join

library(dplyr)
left_join(tbl, metadata[c('id', 'age')])

Если столбец, используемый для объединения, имеет одно и то же имя, то by должно работать

left_join(tbl, metadata[c('id', 'age')], by = "id")

Если оно отличается по имени, то есть 'idA', 'idB', используйте by = c('idA' = 'idB')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...