Как объединить данные, чтобы применить ко всем уникальным условиям столбца во втором наборе данных, даже если они не выполняются

#r #dplyr #tidyr #data-manipulation

#r #dplyr #tidyr #манипулирование данными

Вопрос:

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

 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 для каждого значения, отличного от site. Я хочу, чтобы dataframe2 применялся для каждого уникального значения под идентификатором столбца, чтобы каждый идентификатор отображал все сайты. Я не уверен, как лучше всего это сделать, любая помощь очень ценится!

Комментарии:

1. можете ли вы изменить all.y на all и посмотреть, что произойдет?

Ответ №1:

Это может быть задание для 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() решается путем преобразования двух столбцов в символы вместо этого.

Комментарии:

1. Это то, что я ищу! Большое спасибо. Я запустил ваш код, но вместо нулей получаю NA. Я исправил это с помощью dataframe[is.na (dataframe)] <- 0