Заполните значения NA в фрейме данных на основе расчета столбцов в другом фрейме данных

У меня есть 2 кадра данных. RP и RP2. Моя цель — заполнить NAs из RP столбцов Country_1 и Country_2 на основе следующих условий:

1. Если ячейка RP уже имеет значение, оставьте ее как есть.

2. Если у него есть NA, то посмотрите TreatmenArea и Subarea этой ячейки и найдите ту же пару TreatmenArea, Subarea в RP2, затем:

a.умножьте это значение на PFaverage столбец RP2 и разделите на 100.

b.если относительная ячейка в RP2 также NA, то оставьте значение в RP как NA

RP<-structure(list(ProductFamily = c("PF_1", "PF_10", "PF_10", "PF_100", 
"PF_100", "PF_101", "PF_102", "PF_102", "PF_102", "PF_102", "PF_103", 
"PF_103", "PF_104", "PF_105", "PF_106", "PF_106", "PF_106", "PF_106", 
"PF_107", "PF_108", "PF_109", "PF_11", "PF_110", "PF_110", "PF_111", 
"PF_111", "PF_111", "PF_112", "PF_112", "PF_113", "PF_113", "PF_113", 
"PF_114", "PF_115", "PF_115", "PF_116", "PF_117", "PF_118", "PF_119", 
"PF_12", "PF_12", "PF_12", "PF_120", "PF_120", "PF_120", "PF_120", 
"PF_120", "PF_120", "PF_121", "PF_122"), TreatmenArea = c("TA_7", 
"TA_2", "TA_2", "TA_6", "TA_6", "TA_2", "TA_2", "TA_2", "TA_2", 
"TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", 
"TA_2", "TA_2", "TA_2", "TA_2", "TA_7", "TA_2", "TA_2", "TA_7", 
"TA_7", "TA_7", "TA_7", "TA_7", "TA_2", "TA_2", "TA_2", "TA_6", 
"TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_5", "TA_5", 
"TA_5", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_2", "TA_4", 
"TA_4"), Subarea = c("SA_16", "SA_5", "SA_5", "SA_15", "SA_15", 
"SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", 
"SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", "SA_6", 
"SA_17", "SA_6", "SA_6", "SA_22", "SA_22", "SA_22", "SA_22", 
"SA_22", "SA_6", "SA_6", "SA_6", "SA_15", "SA_6", "SA_6", "SA_6", 
"SA_6", "SA_6", "SA_6", "SA_11", "SA_11", "SA_11", "SA_6", "SA_6", 
"SA_6", "SA_6", "SA_6", "SA_6", "SA_10", "SA_10"), Country_1 = c(NA, 
NA, NA, NA, NA, 92.6961421759861, NA, NA, NA, NA, 78.3001808318264,NA, NA, NA, 106.832963501416, 0.613496932515337, 104.21011973735, 
NA, NA, NA, NA, NA, 99.5238622522423, NA, NA, NA, NA, NA, NA, 
89.0343347639485, NA, NA, NA, NA, NA, NA, 101.231684009344, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Country_2 = c(NA, 
NA, 161.55950752394, NA, NA, NA, NA, NA, 59.1346153846154, NA, 
NA, NA, NA, 128.113063407181, 93.3812839543959, NA, NA, NA, 137.724550898204, 
NA, NA, NA, NA, 90.1602849510241, 37.3939722071828, NA, NA, 40.9756097560976, 
NA, NA, NA, 87.0095902353967, NA, NA, NA, 50.4591590140164, 92.1639413888299, 
44.7601588756493, NA, NA, NA, NA, NA, 100.053835800808, NA, NA, 
NA, NA, 136.420722135008, NA)), row.names = c(NA, 50L), class = "data.frame")

и РП2

RP2<-structure(list(TreatmenArea = c("TA_1", "TA_1", "TA_1", "TA_1", 
"TA_2", "TA_2", "TA_2", "TA_3", "TA_4", "TA_4", "TA_5", "TA_5", 
"TA_5", "TA_6", "TA_6", "TA_7", "TA_7", "TA_7", "TA_7", "TA_7", 
"TA_7", "TA_7", "TA_7", "TA_8", "TA_9"), Subarea = c("SA_1", 
"SA_2", "SA_3", "SA_4", "SA_5", "SA_6", "SA_7", "SA_8", "SA_10", 
"SA_9", "SA_11", "SA_12", "SA_13", "SA_14", "SA_15", "SA_16", 
"SA_17", "SA_18", "SA_19", "SA_20", "SA_21", "SA_22", "SA_23", 
"SA_24", "SA_25"), Country_1 = c(101.37519256645, 105.268942332558, 
100.49933368058, 104.531597221684, NaN, 83.4404308144341, 86.2833044714836, 
81.808967345926, 79.6786979951661, 77.6863475527052, NaN, 78.3001808318264, 
112.499238782021, 113.526674294436, NaN, 108.350959378962, NaN, 
NaN, 102.243471199266, NaN, 104.323270355678, NaN, NaN, NaN, 
100), Country_2 = c(98.7267717862572, 83.9572019653478, 97.164068306148, 
103.654771613923, 161.55950752394, 75.4091957339533, 96.5255996196344, 
99.8317785594128, 88.1477193135348, NaN, NaN, NaN, 151.411687458963, 
107.652477161141, NaN, NaN, NaN, NaN, 92.4695215620261, NaN, 
88.9890571623243, 39.1847909816402, 87.0642912470953, NaN, NaN
), PFaverage = c(9.09293100169062, 16.2821052631579, 9.76688333333333, 
13.4754047619048, 17.8741666666667, 9.42546567085954, 12.6145188492064, 
12.4536666666667, 7.36169471153846, 13.1581818181818, 21.0866666666667, 
9.58, 16.2525049019608, 11.552822039072, 12.6908333333333, 20.5489611111111, 
11.99, 7.19134920634921, 8.51728472222222, 5.97, 12.2264183501684,6.37925, 16.1375, 11.9384615384615, 15.9185714285714)), class = c("data.frame"), row.names = c(NA, -25L)) 

Если, например, мы проверим первую строку Country_1 в RP, мы увидим, что ее NA и ее Subarea равны SA_16, поэтому мы перейдем к RP2 и проверим, что относительное значение для Country_1 и Subarea SA_16 равно 108.35. Итак, расчет 108.35*20.54(PFaverage)/100.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
library(dplyr)

RP2 %>% 
  mutate_at(c("Country_1", "Country_2"), 
            list(PFa = ~. * PFaverage / 100)) %>% 
  select(TreatmenArea, Subarea, contains("PFa")) %>% 
  right_join(RP, . , by = c("TreatmenArea" , "Subarea")) %>% 
  mutate(Country_1 = coalesce(Country_1, Country_1_PFa),
         Country_2 = coalesce(Country_2, Country_2_PFa)) %>% 
  select(-contains("PFa")) 

#>    ProductFamily TreatmenArea Subarea   Country_1  Country_2
#> 1           PF_1         TA_7   SA_16  22.2649965        NaN
#> 2          PF_10         TA_2    SA_5         NaN  28.877416
#> 3          PF_10         TA_2    SA_5         NaN 161.559508
#> 4         PF_100         TA_6   SA_15         NaN        NaN
#> 5         PF_100         TA_6   SA_15         NaN        NaN
#> 6         PF_101         TA_2    SA_6  92.6961422   7.107668
#> 7         PF_102         TA_2    SA_6   7.8646492   7.107668
#> 8         PF_102         TA_2    SA_6   7.8646492   7.107668
#> 9         PF_102         TA_2    SA_6   7.8646492  59.134615
#> 10        PF_102         TA_2    SA_6   7.8646492   7.107668
...

Created on 2022-04-06 by the reprex package (v2.0.0)

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

firmo23 06.04.2022 20:46

@ Firmo23 Я думаю, вы имеете в виду одинаковые значения для нескольких строк, потому что я не вижу, чтобы они были одинаковыми между столбцами. В этом случае, если вы присмотритесь, вы увидите, что эти строки имеют одинаковые TreatmentArea и Subarea, поэтому они совпадают с одной и той же строкой RP2 и, следовательно, возвращают одно и то же вычисленное значение. Пожалуйста, уточните еще.

M-- 06.04.2022 21:53

Другие вопросы по теме