Замена значений NA из другого кадра данных на id - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть датафрейм df1, как показано ниже -

ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA

Тогда у меня есть df2, как показано ниже -

 ID  Count 
 11  536
 22  654
 33  786
 44  999
 55  890
 66  111
 77  654

Я хочу, чтобы NA значения в df1 были заменены значениями из df2 для этих конкретных идентификаторов.

Полученный df3 должен быть:

ID  Count 
11  345
22  456
33  786
44  765
55  890
66  888
77  654

Любая помощь будет отличной Спасибо

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вы можете использовать объединение обновлений для редактирования этих строк в первой таблице:

library(data.table)
setDT(DF1); setDT(DF2)

DF1[is.na(Count), Count := DF2[.SD, on=.(ID), x.Count]]

Как это работает

  • DF[i, j] фильтрует по i, затем делает j
  • Таким образом, в j, .SD относится к подмножеству данных после фильтрации с помощью i
  • A j с := добавляет или изменяет столбцы в таблице
  • x[i, on=, x.v] равно , как описано в этом аналогичном ответе
0 голосов
/ 25 апреля 2018

Использование dplyr::coalesce сделает задачу проще.

library(dplyr)

df1 %>% inner_join(df2, by= "ID") %>%
  mutate(Count = coalesce(Count.x, Count.y)) %>%
  select(ID, Count)

#   ID Count
# 1 11   345
# 2 22   456
# 3 33   786
# 4 44   765
# 5 55   890
# 6 66   888
# 7 77   654

Данные:

df1 <- read.table(text = 
"ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA",
header = TRUE)

df2 <- read.table(text = 
"ID  Count 
11  536
22  654
33  786
44  999
55  890
66  111
77  654",
header = TRUE)
0 голосов
/ 24 апреля 2018

Использование dplyr:

library(dplyr)

df1 %>%
  left_join(df2, by = c("ID")) %>%
  mutate(Count = ifelse(is.na(Count.x), Count.y, Count.x)) %>%
  select(-c(Count.x, Count.y))

Это дает

  ID Count
1 11   345
2 22   456
3 33   786
4 44   765
5 55   890
6 66   888
7 77   654
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...