Изменение формы в data.table - PullRequest
       44

Изменение формы в data.table

0 голосов
/ 24 сентября 2018

РЕДАКТИРОВАТЬ: Я немного отредактировал свой вопрос, потому что предложенное решение было немного проблематично для моего набора данных.ОП написано ниже.

У меня есть набор данных df, из которых prop - это количество наблюдений в этом году, как доля от общего количества наблюдений.Например: для Нидерландов (NLD) 60% наблюдений имеют 2005 год. Для Болгарии (BLG) это 50%.

    row country year prop
1:   1     NLD 2005  0.6
2:   2     NLD 2005  0.6
3:   3     BLG 2006  0.5
4:   4     BLG 2005  0.5
5:   5     GER 2005  1.0
6:   6     NLD 2007  0.2
7:   7     NLD 2005  0.6
8:   8     NLD 2008  0.2

Я хочу получить следующее:

    row country prop2005 prop2006 prop2007 prop 2008 
1:   1     NLD  0.6      0.0      0.2      0.2
2:   2     NLD  0.6      0.0      0.2      0.2
3:   3     NLD  0.6      0.0      0.2      0.2
4:   4     BLG  0.5      0.5      0.0      0.0
5:   5     BLG  0.5      0.5      0.0      0.0
6:   6     BLG  0.5      0.5      0.0      0.0
7:   7     GER  1.0      0.0      0.0      0.0
8:   8     GER  1.0      0.0      0.0      0.0
9:   9     GER  1.0      0.0      0.0      0.0

ОРИГИНАЛЬНАЯ ПОЧТА:

У меня есть набор данных df, в котором prop - это количество наблюдений в этом году, как доля от общего числа наблюдений.Например: для Нидерландов (NLD) 60% наблюдений имеют 2005 год. Для Болгарии (BLG) это 50%.

    row country year prop
1:   1     NLD 2005  0.6
2:   2     NLD 2005  0.6
3:   3     BLG 2006  0.5
4:   4     BLG 2005  0.5
5:   5     GER 2005  1.0
6:   6     NLD 2007  0.2
7:   7     NLD 2005  0.6
8:   8     NLD 2008  0.2

Я хотел бы связать эти значения с другим набором данных (df2, который имеет вопросы, относящиеся к тем годам) и выглядит следующим образом:

    row country q05 q06 q07 q08 
1:   1     NLD  1   2   1   3   
2:   2     NLD  2   1   2   3   
3:   3     NLD  1   2   2   4   
4:   4     BLG  5   5   2   4   
5:   5     BLG  1   2   1   1   
6:   6     BLG  2   2   5   1   
7:   7     GER  3   5   4   4   
8:   8     GER  2   5   3   4   
9:   9     GER  1   2   3   5  

Я хочу получить следующее:

    row country prop2005 prop2006 prop2007 prop 2008 
1:   1     NLD  1   2   1   3   0.6      0.0      0.2      0.2
2:   2     NLD  2   1   2   3   0.6      0.0      0.2      0.2
3:   3     NLD  1   2   2   4   0.6      0.0      0.2      0.2
4:   4     BLG  5   5   2   4   0.5      0.5      0.0      0.0
5:   5     BLG  1   2   1   1   0.5      0.5      0.0      0.0
6:   6     BLG  2   2   5   1   0.5      0.5      0.0      0.0
7:   7     GER  3   5   4   4   1.0      0.0      0.0      0.0
8:   8     GER  2   5   3   4   1.0      0.0      0.0      0.0
9:   9     GER  1   2   3   5   1.0      0.0      0.0      0.0

Другими словами, для каждого наблюдения,Я хочу, чтобы пропорции, связанные с этой страной, были добавлены к наблюдению (поскольку они функционируют как вес).

Я достаточно знаком со слиянием в data.table;

df1 <- merge(df1, df2,  by= "country", all.x = TRUE, allow.cartesian=FALSE)

Однако ядействительно не знаю, как мне изменить форму data.table, чтобы правильно объединить его.

Есть предложения?

ТЕКУЩЕЕ "РЕШЕНИЕ":

df1 <- dcast(df1, country~year, value="prop")
df1 <- merge(df1, df2,  by= "country", all.x = TRUE, allow.cartesian=FALSE)

1 Ответ

0 голосов
/ 24 сентября 2018

Возможное решение:

melt(df2, id = 1:2, value.name = 'q'
     )[, year := as.integer(paste0('20',sub('\\D+','',variable)))
       ][df, on = .(country, year), prop := i.prop
         ][is.na(prop), prop := 0
           ][, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]

, что дает:

   row country q2005 q2006 q2007 q2008 prop2005 prop2006 prop2007 prop2008
1:   1     NLD     1     2     1     3      0.6      0.0      0.2      0.2
2:   2     NLD     2     1     2     3      0.6      0.0      0.2      0.2
3:   3     NLD     1     2     2     4      0.6      0.0      0.2      0.2
4:   4     BLG     5     5     2     4      0.5      0.5      0.0      0.0
5:   5     BLG     1     2     1     1      0.5      0.5      0.0      0.0
6:   6     BLG     2     2     5     1      0.5      0.5      0.0      0.0
7:   7     GER     3     5     4     4      1.0      0.0      0.0      0.0
8:   8     GER     2     5     3     4      1.0      0.0      0.0      0.0
9:   9     GER     1     2     3     5      1.0      0.0      0.0      0.0

Чтобы увидеть, как это работает, вы можете разбить код на несколько шагов следующим образом:

df3 <- melt(df2, id = 1:2, value.name = 'q')[, year := as.integer(paste0('20',sub('\\D+','',variable)))]

df3[df, on = .(country, year), prop := i.prop][]
df3[is.na(prop), prop := 0][]
df3[, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...