Как объединить данные, чтобы применить их ко всем уникальным условиям столбца во втором наборе данных, даже если это не происходит - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь вставить новые строки данных на основе уникальных значений столбца в моем исходном наборе данных. У меня есть следующий набор фиктивных данных:

sites<-c("10","10","11","11","12","12")
ID<-c("A","A","B","B","C","D")
value<-c("4","6","5","2","7","8")
dataframe<-data.frame(sites, ID, value)

sites<-c("10","10","11","11","12","12","13","14","15")
dataframe2<-data.frame(sites)

Производство:

  sites ID value
    10  A     4
    10  A     6
    11  B     5
    11  B     2
    12  C     7
    12  D     8

  sites
     10
     10
     11
     11
     12
     12
     13
     14
     15

Для каждого уникального значения в идентификаторе столбца я хотел бы, чтобы применялся каждый номер сайта из второго фрейма данных, а когда значение отсутствует, я хотел бы, чтобы оно печатало 0.

Так, например, для идентификатора A будут перечислены все сайты из site2, и когда значение отсутствует (то есть для сайта 11, 12, 13,14), я бы хотел, чтобы значение 0 указывалось.

Я пробовал следующее:

mergeddata<-merge(dataframe, dataframe2, by="sites", all.y=TRUE)

Но это только добавляет новые сайты внизу с NA для каждого значения, кроме сайта. Я хочу, чтобы dataframe2 применялся к каждому уникальному значению в столбце ID, чтобы у каждого идентификатора были вхождения всех сайтов. Я не уверен, что лучший способ это сделать, любая помощь очень ценится!

1 Ответ

2 голосов
/ 26 марта 2019

Это может быть работа для complete() из пакета tidyr . Вы можете сгруппировать свой первый набор данных по ID, а затем использовать complete(), чтобы добавить строки для значений site из dataframe2 в каждой группе.

В результате получается по крайней мере одна строка для каждого site в каждом ID. Я использую аргумент fill, чтобы добавить 0 к value для новых строк (после преобразования value в числовое значение).

library(dplyr)
library(tidyr)

dataframe$value = as.numeric( as.character(dataframe$value) )

dataframe %>%
    group_by(ID) %>%
    complete(sites = dataframe2$sites, fill = list(value = 0) )

# A tibble: 26 x 3
# Groups:   ID [4]
   ID    sites value
   <fct> <chr> <dbl>
 1 A     10        4
 2 A     10        6
 3 A     11        0
 4 A     12        0
 5 A     13        0
 6 A     14        0
 7 A     15        0
 8 B     10        0
 9 B     11        5
10 B     11        2
# ... with 16 more rows
Warning message:
Column `sites` joining factors with different levels, coercing to character vector 

Предупреждающее сообщение имеет отношение к site, являющемуся фактором в двух наборах данных, с которым complete() имеет дело путем преобразования двух столбцов в символы.

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