从长到宽,带有角色扭曲

Long to wide with a character twist

我有一个看起来像 this and 的问题,但我无法得到我想要的。

我有以下示例数据集:

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),保留领带。所以示例数据集的最终结果将如下所示:

请注意,对于美国,"ties" 被保留,所以我得到的不是前 2 名,而是前 3 名。平局可能发生在 CHN 中。

我试过使用嵌套循环和 rbind,但我无法使其工作。我还查看了一些从长到宽的线程,但绝大多数只有 "reshape" 个数字,而不是字符,这就是 VAR。我怀疑 dplyr 解决方案是有意义的,但我无法让它工作。谢谢

我们可以使用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="")