#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