Замена значений во фрейме данных на основе имен столбцов, идентификационных номеров и значений ключей из других фреймов данных - PullRequest
2 голосов
/ 08 марта 2020

Я пытаюсь объединить данные из нескольких источников.
В приведенном ниже примере я хотел бы создать новый фрейм данных с именем RESULT. Мне нужно заменить значения из ячеек dt2 значениями SCORE в dt1 на основе переменных ID и TASK.

dt1 <- read.table(text = "
ID   TASK        SCORE  
1    task1        0 
1    task2        0 
2    task1        1 
2    task2        0 
3    task1        1 
3    task2        0 
4    task1        0 
4    task2        1
5    task1        1 
5    task2        0 
6    task1        0 
6    task2        1 
", header = TRUE, stringsAsFactors = FALSE)

dt2 <- read.table(text = "
ID   THING1    THING2   THING3   THING4
1        NA     task2    NA      task1
2        NA     NA       NA      NA
3        task1  NA       task2   NA
4        NA     task1    NA      task2
5        task2  NA       task1   NA
6        NA     task1    task2   NA
", header = TRUE, stringsAsFactors = FALSE)

RESULT <- read.table(text = "
ID   THING1  THING2  THING3  THING4
1        NA     0       NA      0
2        NA     NA      NA      NA
3        1      NA      0       NA
4        NA     0       NA      1
5        0      NA      1       NA
6        NA     0       1       NA 
", header = TRUE, stringsAsFactors = FALSE) 

Например, в dt1, мы видим, что ID = 1 получил оценку 0 на task1. Из dt2 мы можем видеть, что ID = 1 сделал THING4 для своего первого TASK. Как показано в кадре данных RESULT, ID = 1 теперь имеет значение 0 для THING2.

Я не совсем уверен, с чего начать. Я прочитал несколько тем, но ни одна из них (которые я могу найти) не решает эту точную проблему (например, здесь и здесь ), и я не совсем уверен, как изменить эти примеры, чтобы получить результат, который мне нужен, потому что этот вид программирования является очень новым для меня. Так что я буду очень признателен за любые предложения!

1 Ответ

2 голосов
/ 08 марта 2020

Мы можем преобразовать в «длинный» формат, выполнить объединение и затем изменить форму обратно на «широкий» после замены значений

library(dplyr)
library(tidyr)
dt2 %>% 
   pivot_longer(cols = -ID, values_to = 'TASK') %>%
   left_join(dt1) %>%
   mutate(TASK = coalesce(as.character(SCORE), TASK)) %>% 
   select(-SCORE) %>% 
   pivot_wider(names_from = name, values_from = TASK)
# A tibble: 6 x 5
#     ID THING1 THING2 THING3 THING4
#  <int> <chr>  <chr>  <chr>  <chr> 
#1     1 <NA>   0      <NA>   0     
#2     2 <NA>   <NA>   <NA>   <NA>  
#3     3 1      <NA>   0      <NA>  
#4     4 <NA>   0      <NA>   1     
#5     5 0      <NA>   1      <NA>  
#6     6 <NA>   0      1      <NA>  

. Или другой параметр - match

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