Как изменить столбцы в таблице данных на основе указанной строки данных c - PullRequest
1 голос
/ 26 марта 2020

У меня есть данные двусторонних обменов, такие как:

library(datatable)

mwe <- data.table(Importer=c("Country_A","Country_A","Country_A","Country_A",
                             "Country_B","Country_B","Country_B","Country_B",
                             "World","World","World","World",
                             "Country_C","Country_C","Country_C","Country_C"),
                  Short_Importer=c("A","A","A","A",
                                   "B","B","B","B",
                                   "W","W","W","W",
                                   "C","C","C","C"),
                  Exporter=c("Country_A", "Country_B", "World", "Country_C",
                             "Country_A", "Country_B", "World", "Country_C",
                             "Country_A", "Country_B", "World", "Country_C",
                             "Country_A", "Country_B", "World", "Country_C"),
                  Value=c(0,12,36,24,
                          10,0,44,34,
                          30,22,110,58,
                          20,10,30,0))

Я изменил их в более широком формате

mwe_wide <- dcast(mwe, Importer + Short_Importer ~ Exporter, value.var = "Value")

Я бы хотел, чтобы это было датировано, но вместо этого использовались доли в столбцах ценностей. Поэтому я хотел бы просто заменить столбцы с 3 по 5 теми же значениями, деленными на сумму в том же столбце для мира строк. Я предполагаю, что это не очень сложно, но не нашел удовлетворительного способа сделать это. В действительности у меня есть несколько субрегионов, поэтому я хотел бы избежать удаления мира линий и деления их на сумму.

desired_output <- data.table(Importer=c("Country_A", "Country_B", "Country_C", "World"),
                             Short_Importer=c("A","B","C","W"),
                             Country_A =c(0,0.33,0.66,1),
                             Country_B =c(0,0.55,0.45,1),
                             Country_C =c(0,0.41,0.59,1),
                             World =c(0.33,0.40,0.27,1))

1 Ответ

1 голос
/ 26 марта 2020

Если нам нужно разделить на последнюю строку, где «Импортер» - «Мир»

mwe_wide[, (3:6) := lapply(.SD, function(x) 
           round(x/x[Importer == "World"],  2)), .SDcols = 3:6] 
mwe_wide
#    Importer Short_Importer Country_A Country_B Country_C World
#1: Country_A              A      0.00      0.55      0.41  0.33
#2: Country_B              B      0.33      0.00      0.59  0.40
#3: Country_C              C      0.67      0.45      0.00  0.27
#4:     World              W      1.00      1.00      1.00  1.00

Или с Map

mwe_wide[, (3:6) := Map(`/`, .SD, .SD[Importer == 'World']), .SDcols = 3:6]
...