根据对其他数据框中列的计算,在数据框中填充 NAs 值
Fill the NAs values in a dataframe based on calculation of columns in other dataframe
我有 2 个数据框。 RP
和 RP2
。我的目标是根据以下条件填充 RP
列 Country_1
和 Country_2
中的 NAs
:
1.If RP
的一个单元格已经有值保持原样。
2.If 它有 NA
然后查看该单元格的 TreatmenArea
和 Subarea
并找到相同的一对 TreatmenArea
, Subarea
在 RP2
然后:
a.multiply 这个值与 RP2
的 PFaverage
列除以 100。
b.if 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")
和 RP2
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))
例如,如果我们检查 RP 中 Country_1
的第一行,我们看到它的 NA
和它的 Subarea
是 SA_16
,所以我们移动到 RP2
并检查 Country_1
和 Subarea SA_16
的相对值是否为 108.35
。所以计算是108.35*20.54(PFaverage)/100
.
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
...
由 reprex package (v2.0.0)
于 2022-04-06 创建
我有 2 个数据框。 RP
和 RP2
。我的目标是根据以下条件填充 RP
列 Country_1
和 Country_2
中的 NAs
:
1.If RP
的一个单元格已经有值保持原样。
2.If 它有 NA
然后查看该单元格的 TreatmenArea
和 Subarea
并找到相同的一对 TreatmenArea
, Subarea
在 RP2
然后:
a.multiply 这个值与 RP2
的 PFaverage
列除以 100。
b.if 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")
和 RP2
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))
例如,如果我们检查 RP 中 Country_1
的第一行,我们看到它的 NA
和它的 Subarea
是 SA_16
,所以我们移动到 RP2
并检查 Country_1
和 Subarea SA_16
的相对值是否为 108.35
。所以计算是108.35*20.54(PFaverage)/100
.
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
...
由 reprex package (v2.0.0)
于 2022-04-06 创建