2016-03-03 2 views
0

У меня есть группа из разных стран в R, и я хочу создавать категории на основе значения определенной переменной (в данном случае «var3») в конкретном году (здесь 3).Категоризировать группы в панели по значению переменной в конкретном году в R

Пример того, что я в настоящее время:

# create data 
test.data = as.data.frame(matrix(rexp(200, rate=.1), ncol=5)) 
colnames(test.data) = c("year", "country", "var1", "var2", "var3") 
test.data$year = rep.int(1:5, 8) 
test.data$country = rep(1:8, each=5) 

# calculate median, minimum and maximum of 'var3' 
median = quantile(x = test.data[test.data$year == 3, 5], probs = c(0.5)) 
min = min(test.data[test.data$year == 3, 5]) 
max = max(test.data[test.data$year == 3, 5]) 

# create category variable based on values of 'var3' 
test.data$cat.1 = cut(test.data$var3, c(min, median, max)) 

В этом случае значение «Кат.1» зависит от значения «var3» соответствующего наблюдения, но я хочу, чтобы зависеть от значение конкретного года конкретной страны (т. е. я хочу того же значения для всех лет конкретной страны). Есть ли простой способ сделать это или мне нужно сделать это вручную (выберите страны каждой группы и присвойте им значения). Если количество групп постоянное, то это вручную, но это немного громоздко, если вы хотите попробовать разные размеры группы.

В настоящее время результат выглядит следующим образом:

year country  var1  var2  var3  cat.1 
1  1  1 4.4206363 9.32628504 4.0988089 (1.2,6.71] 
2  2  1 7.6072491 6.30949828 39.5694414  <NA> 
3  3  1 3.3774183 7.94397550 8.8419793 (6.71,22.2] 
4  4  1 1.0300372 9.93858310 0.4908481  <NA> 
5  5  1 6.4514008 2.10367840 29.6052797  <NA> 
6  1  2 8.7609877 5.76332181 17.4117561 (6.71,22.2] 
7  2  2 6.1253021 0.17258071 23.9096280  <NA> 
8  3  2 48.3335241 1.19255084 3.3644827 (1.2,6.71] 
9  4  2 34.1683821 10.98216846 29.0255100  <NA> 
10 5  2 15.5824154 2.53484781 16.3466249 (6.71,22.2] 

Но я хочу вместо этого:

year country  var1  var2  var3  cat.1 
1  1  1 4.4206363 9.32628504 4.0988089 (6.71,22.2] 
2  2  1 7.6072491 6.30949828 39.5694414 (6.71,22.2] 
3  3  1 3.3774183 7.94397550 8.8419793 (6.71,22.2] 
4  4  1 1.0300372 9.93858310 0.4908481 (6.71,22.2] 
5  5  1 6.4514008 2.10367840 29.6052797 (6.71,22.2] 
6  1  2 8.7609877 5.76332181 17.4117561 (1.2,6.71] 
7  2  2 6.1253021 0.17258071 23.9096280 (1.2,6.71] 
8  3  2 48.3335241 1.19255084 3.3644827 (1.2,6.71] 
9  4  2 34.1683821 10.98216846 29.0255100 (1.2,6.71] 
10 5  2 15.5824154 2.53484781 16.3466249 (1.2,6.71] 
+0

Возможно, вы захотите посмотреть на 'dplyr ::: group_by' в связи с' dplyr ::: mutate'. – coffeinjunky

+0

Спасибо за подсказку! –

+0

Можете ли вы создать ожидаемый или желаемый результат в виде таблицы, а не описывать ее словами? – user5249203

ответ

1

Что-то по следующим направлениям, может быть? Сначала создается переменная, которая для каждой страны соответствует var3 в 3-м году, а затем разрезает эту переменную. Это должно работать для многих групп, если по группам вы имеете в виду страны.

library(dplyr) 
out <- test.data %>% group_by(country) %>% mutate(to.cut = var3[year==3]) 
out$cat.1 = cut(out$to.cut, c(min, median, max), include.lowest=T) 
out 

Source: local data frame [40 x 7] 
Groups: country [8] 

    year country  var1  var2  var3  cat.1 to.cut 
    (int) (int)  (dbl)  (dbl)  (dbl)  (fctr) (dbl) 
1  1  1 2.945957 8.785060 21.820063 (10.3,35.5] 12.06913 
2  2  1 1.473719 29.944750 6.915839 (10.3,35.5] 12.06913 
3  3  1 8.880734 3.624519 12.069131 (10.3,35.5] 12.06913 
4  4  1 31.746000 9.698126 5.929075 (10.3,35.5] 12.06913 
5  5  1 34.639945 2.983025 15.438284 (10.3,35.5] 12.06913 
6  1  2 16.757240 8.719741 27.412963 (10.3,35.5] 14.74931 
7  2  2 1.155467 3.146425 1.730943 (10.3,35.5] 14.74931 
8  3  2 1.738710 2.292280 14.749311 (10.3,35.5] 14.74931 
9  4  2 13.120079 0.130744 3.000918 (10.3,35.5] 14.74931 
10  5  2 27.898422 10.891313 20.912835 (10.3,35.5] 14.74931 

Комментарий: цифры, очевидно, отличаются от ваших таблиц, поскольку у нас есть разные семена для генераторов случайных чисел. В ваших столах результат cut колеблется от country 1 до country 2. Поскольку резка осуществляется во всех странах, это различие может быть вызвано случайностью. Если это не то, что вы ожидаете, укажите семя, с помощью которого можно воспроизвести исходную таблицу.

+0

Большое спасибо, я проверю, как только у меня будет время! –

+0

Да, я сначала проверю, но на первый взгляд это выглядит хорошо! –

+0

Кажется, есть одна проблема. cat.1 имеет только NA для страны с наименьшим var3, так как значения границ округлены. Наверное, вы должны увидеть, если вы посмотрите на весь «выход»? –