2016-08-12 5 views
0

Я работаю с базой данных ФАО по производству сельскохозяйственных культур по странам. В частности, у меня есть таблица данных с указанием производства риса в год от каждой страны в мире не начиная с 1961 года до 2014 года Вот упрощенная версия моих данных:R - Условное математическое выражение в таблице данных

d <- data.table(structure(list(Year = c(1961, 1962, 1963, 1964, 1965, 1966, 1967, 
1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 
1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 
1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 
2012, 2013, 2014, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 
1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 
1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 
1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 
2002, 2003, 2004, 2005, 2006), Country = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania"), totalprod = c(319000, 319000, 319000, 380000, 380000, 
337000, 396000, 402000, 407000, 366000, 350000, 4e+05, 420000, 
420000, 435000, 448000, 4e+05, 428000, 439000, 415000, 390000, 
364000, 350000, 334000, 317000, 336000, 324000, 343000, 320000, 
333000, 335000, 3e+05, 3e+05, 342000, 390000, 340000, 4e+05, 
450000, 280000, 260000, 242000, 388000, 434000, 463000, 485000, 
540000, 552000, 612000, 645000, 672000, 672000, 5e+05, 512094, 
537000, 4603, 5683, 9135, 8173, 10225, 10524, 11254, 12807, 14276, 
14924, 10760, 12000, 15168, 12000, 13500, 14000, 14400, 14800, 
15520, 13000, 13900, 11900, 13000, 12600, 12000, 11000, 10600, 
8830, 8450, 7000, 2283, 960, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0)), .Names = c("Year", "Country", "totalprod"), class = "data.frame", row.names = c(NA, 
-100L))) 

Мне нужно суммировать эту таблицу данных в двух разных Пути:

a) Сначала мне нужно рассчитать глобальное производство риса в год, объединив производство каждой страны в год. Мне удалось ответить на этот вопрос, выполнив:

d.global.year <- d[, list(totalprodyear=sum(totalprod)), by=Year] 

б) После того, как у меня есть мировое производство риса в год, мне нужно, чтобы определить вклад каждой страны в год. Это будет сделано путем деления производства каждой страны на мировое производство риса на ежегодной основе.

Однако я все еще пытаюсь найти способ решить b).

EDITED: Ожидаемый результат:

Давайте возьмем, например, глобальное потребление риса в 1961 году: 323603

В этом случае вклад Афганистана будет 319000/323603 = 0,986 и Албании будет 4603/323603 = 0,014

Любые советы?

ответ

1

Вы можете сделать это в процессе two-stage GroupBy, во-первых группу по Year и рассчитать общий продукт для каждого года, а затем группа оба Year и Country, где вы можете использовать общий продукт, рассчитанный на предыдущем этапе для расчета доля каждого взноса каждой страны:

sumDt <- d[, totalprodyear :=sum(totalprod), by=Year] 
      [, .(totalprodyear, percentprod = sum(totalprod)/totalprodyear), by = .(Year, Country)] 
sumDt[, head(.SD, 3), by = Country] 
#  Country Year totalprodyear percentprod 
# 1: Afghanistan 1961  323603 0.98577578 
# 2: Afghanistan 1962  324683 0.98249677 
# 3: Afghanistan 1963  328135 0.97216085 
# 4:  Albania 1961  323603 0.01422422 
# 5:  Albania 1962  324683 0.01750323 
# 6:  Albania 1963  328135 0.02783915 
+2

Страны, похоже, не имеют нескольких записей в год, поэтому вам не потребуется сумма на втором этапе. 'd [,. (Страна, frac = totalprod/sum (totalprod)), by = Year]' или что-то. Кроме того, я думаю, вы начинаете разбить бит между первыми двумя строками. – Frank

+0

Это работает, спасибо. – thiagoveloso

+2

@Frank Я не очень внимательно смотрел на данные. Пытался предложить более безопасный способ решить проблему, если в стране есть несколько записей. – Psidom

2

Это базовое решение, которое разбивает его на шаги, которые вы просите.

xd <- xtabs(totalprod~ Year+Country, data=d) 

xd <- cbind(xd, yr.total=rowSums(xd)) 

str(xd) 
num [1:54, 1:3] 319000 319000 319000 380000 380000 337000 396000 402000 407000 366000 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:54] "1961" "1962" "1963" "1964" ... 
    ..$ : chr [1:3] "Afghanistan" "Albania" "yr.total" 
xd[ , -3]/xd[,3] 
    Afghanistan  Albania 
1961 0.9857758 0.014224219 
1962 0.9824968 0.017503226 
1963 0.9721608 0.027839152 
1964 0.9789450 0.021055045 
#snipped table 
+0

Это работает, спасибо. Тем не менее, результат немного громоздкий, поскольку в списке есть 129 стран, а наличие их в столбцах не очень удобно. – thiagoveloso

+1

Я не понимаю нисходящего. Выбор парадигмы шокирования данных - это скорее вопрос предпочтения, а не правильность. Всегда есть 'as.data.frame.table', чтобы взять« широкую »таблицу в« длинный »фрейм данных. –

+0

Извините, я, должно быть, коснулся его по ошибке на моем мобильном телефоне. Можете ли вы сделать небольшое редактирование, чтобы я мог снова проголосовать? – thiagoveloso