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

#r #dataframe #merge #match

Вопрос:

Я хотел бы попросить о помощи!

Я пытаюсь добавить новый столбец «TotalSasaran» в свой первый фрейм данных «набор данных» с 5000 строками

Тангал Диваксин1 Диваксин2 Всего Диваксин Provinsi
2-1-2021 1 2 3 Ачех
5-1-2021 1 2 3 Ачех
2-1-2021 2 2 3 Бали
4-1-2021 2 2 3 Бали
3-1-201 3 1 4 Jakarta
6-1-201 3 1 4 Jakarta
 structure(list(tanggal = structure(1:6, .Label = c("2021-01-15", 
"2021-01-17", "2021-01-18", "2021-01-19", "2021-01-20", "2021-01-21", 
"2021-01-22", "2021-01-23", "2021-01-24", "2021-01-25", "2021-01-26", 
"2021-01-27", "2021-01-28", "2021-01-29", "2021-01-30", "2021-01-31", 
"2021-02-01", "2021-02-02", "2021-02-03", "2021-02-04", "2021-02-05", 
"2021-02-06", "2021-02-07", "2021-02-08", "2021-02-09", "2021-02-10", 
"2021-02-11", "2021-02-12", "2021-02-13", "2021-02-14", "2021-02-15", 
"2021-02-16", "2021-02-17", "2021-02-18", "2021-02-19", "2021-02-20", 
"2021-02-21", "2021-02-22", "2021-02-23", "2021-02-24", "2021-02-25", 
"2021-02-26", "2021-02-27", "2021-02-28", "2021-03-01", "2021-03-02", 
"2021-03-03", "2021-03-04", "2021-03-05", "2021-03-06", "2021-03-07", 
"2021-03-08", "2021-03-09", "2021-03-10", "2021-03-11", "2021-03-12", 
"2021-03-13", "2021-03-14", "2021-03-15", "2021-03-16", "2021-03-17", 
"2021-03-18", "2021-03-19", "2021-03-20", "2021-03-21", "2021-03-22", 
"2021-03-23", "2021-03-24", "2021-03-25", "2021-03-26", "2021-03-27", 
"2021-03-28", "2021-03-29", "2021-03-30", "2021-03-31", "2021-04-01", 
"2021-04-02", "2021-04-03", "2021-04-04", "2021-04-05", "2021-04-06", 
"2021-04-07", "2021-04-08", "2021-04-09", "2021-04-10", "2021-04-11", 
"2021-04-12", "2021-04-13", "2021-04-14", "2021-04-15", "2021-04-16", 
"2021-04-17", "2021-04-18", "2021-04-19", "2021-04-20", "2021-04-21", 
"2021-04-22", "2021-04-23", "2021-04-24", "2021-04-25", "2021-04-26", 
"2021-04-27", "2021-04-28", "2021-04-29", "2021-04-30", "2021-05-01", 
"2021-05-02", "2021-05-03", "2021-05-04", "2021-05-05", "2021-05-06", 
"2021-05-07", "2021-05-08", "2021-05-09", "2021-05-10", "2021-05-11", 
"2021-05-12", "2021-05-13", "2021-05-14", "2021-05-17", "2021-05-18", 
"2021-05-19", "2021-05-20", "2021-05-21", "2021-05-22", "2021-05-23", 
"2021-05-24", "2021-05-25", "2021-05-26", "2021-05-27", "2021-05-28", 
"2021-05-29", "2021-05-30", "2021-05-31", "2021-06-01", "2021-06-02", 
"2021-06-03", "2021-06-04", "2021-06-05", "2021-06-06", "2021-06-07", 
"2021-06-08", "2021-06-09", "2021-06-10", "2021-01-13", "2021-01-14", 
"2021-01-16", "2021-05-15", "2021-05-16"), class = "factor"), 
    divaksin_1 = c(35, 1, 13, 16, 36, 42), divaksin_2 = c(0, 
    0, 0, 0, 0, 0), total_divaksin = c(35, 1, 13, 16, 36, 42), 
    Provinsi = c("Aceh", "Aceh", "Aceh", "Aceh", "Aceh", "Aceh"
    )), row.names = c(NA, 6L), class = "data.frame")
 

основываясь на значении в моем втором df «Total_Sasaran», содержащем всего 34 строки.

Provinsi Всего Сасаран
Ачех 1000
Бали 1500
Jakarta 2000
 structure(list(Provinsi = c("ACEH", "BALI", "BANTEN", "BENGKULU", 
"DKI JAKARTA", "GORONTALO"), TotalSasaran = c(3898726, 2860037, 
8838393, 1327824, 8815157, 784727)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))
 

Оба кадра данных имеют столбец идентификатора «Provinsi». Я надеюсь, что R сможет идентифицировать набор данных$Provinsi и сопоставить его с Total_Sasaran$Provinsi, чтобы получить значение TotalSasaran для каждой строки в наборе данных.

Я перепробовал несколько кодов, но не вернул ожидаемый результат 1-я пробная версия кода

 dataset$TotalSasaran<-Total_Sasaran$TotalSasaran[match(dataset$Provinsi,Total_Sasaran$Provinsi)]
 

2-й код:

 dataset$TotalSasaran <- Total_Sasaran$TotalSasaran[Total_Sasaran$Provinsi %in% dataset$Provinsi]
 

3-й код:

 dataset2<-inner_join(dataset,Total_Sasaran, by="Provinsi")
 

Это возвращает 0 наблюдений, в кадре данных не было данных, я убедился, что классы совпадали, «Провинси» в качестве факторов и «Итоговые данные» в качестве числовых

4-е

 dataset2<-merge(dataset, Total_Sasaran, by="Provinsi", all.x=TRUE)
 

Это возвращает весь столбец ‘TotalSasaran’ в виде NA

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

1. Попробуйте inner_join из dplyr пакге

2.Я попытался использовать inner_join: dataset2<-merge(dataset, Total_Sasaran[, c("Provinsi", "TotalSasaran")], by="Provinsi", all.x=TRUE) dataset2<-merge(dataset, Total_Sasaran, by="Provinsi", all.x=TRUE) но он возвращает столбец «TotalSasaran» как NA. Что-то не так? Я убедился, что все классы были подобраны.

3. Вы пробовали merge(dataset, Total_Sasaran) ?

4.Да, я сделал это, dataset2<-merge(dataset, Total_Sasaran[, c("Provinsi", "TotalSasaran")], by="Provinsi", all.x=TRUE) dataset2<-merge(dataset, Total_Sasaran, by="Provinsi", all.x=TRUE) но он, к сожалению, вернул колонку как NA…

5. Совпадает ли Provinsi столбец в dataset точности с тем из Total_Sasaran ? Есть ли в них какие-либо пробелы? Вы можете удалить пробелы с trimws помощью . Было бы легче помочь, если бы вы предоставили dput(head(dataset)) и dput(head(Total_Sasaran[, c("Provinsi", "TotalSasaran")]))

Ответ №1:

В обоих случаях данные не совпадают, один-верхний регистр, а другой — нижний регистр. R чувствителен к регистру, поэтому либо измените один из фреймов данных, а затем сделайте merge это .

 df1$Provinsi <- toupper(df1$Provinsi)
result <- merge(df1, df2)
 

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

1. Спасибо!!! Я не знал, что это будет чувствительно к регистру.

Ответ №2:

Первая проблема, которую необходимо решить, заключается в том, что «Провинси» в этих двух data.frame не имеют никаких совпадающих значений: в 1. у вас есть Aceh в 2. у вас есть ACEH . Это не один и тот же случай.

Вы можете либо преобразовать вход Aceh в dataset верхний

 dataset$Provinsi = toupper(dataset$Provinsi)
 

или преобразовать ACEH etc в Total_Saran регистр заголовка или в регистр предложения (https://stringr.tidyverse.org/reference/case.html):

 library(stringr)
Total_Saran = Total_Saran%>%
 mutate(Provinsi =  str_to_title(Provinsi))
 

Не делай и того, и другого! Затем присоединяйтесь к этим двум с left_join :

 library(dplyr)

df3 = left_join(dataset,Total_Saran)