长到宽的角色扭曲

时间:2016-10-26 09:22:46

标签: r dplyr reshape data-manipulation

我遇到的问题看起来像thisthis,但我无法理解我所追求的目标。

我有以下样本数据集:

country_code=c('USA','USA','USA','USA','USA','USA','CHN','CHN','CHN','CHN','CHN','CHN')
target_var=c('V1','V1','V1'  ,'V2'  ,'V2' ,'V2' ,'V1' ,'V1' ,'V1','V2' ,'V2' ,'V2')
VAR=       c('X7','X8','X140','X114','X18','X28','X29','X22','X2','X22','X23','X24')
Ranking=   c(1   ,2.5 ,2.5   ,1.5   ,1.5  ,1.5  , 1   ,2    ,3   ,1.5  ,1.5  ,3)
df<-data.frame(country_code,target_var,VAR,Ranking)

我需要为country_code和target_var的所有组合从长格式转换为宽格式。我指的是我只想通过排名保留顶级X VAR(让我们说这个例子为2),保留关系。因此,示例数据集的最终结果如下所示:

请注意,对于美国而言,保留“关系”,而不是前2名,我获得前3名。关系可能发生在CHN中。

enter image description here

我尝试过使用嵌套循环和rbind,但我无法使其正常工作。我还看了很多线程,但是绝大多数只是“重塑”数字,而不是字符,这就是VAR的含义。我怀疑dplyr解决方案是有意义的,但我不能让它工作。谢谢

1 个答案:

答案 0 :(得分:4)

我们可以使用top_n对行进行分组,然后使用spread从'long'到'wide'

library(tidyr)
df %>% 
  group_by(country_code, target_var) %>% 
  top_n(2, wt = Ranking) %>%
  mutate(n = row_number()) %>% 
  select(-Ranking) %>% 
  spread(n, VAR, sep="")