我遇到的问题看起来像this和this,但我无法理解我所追求的目标。
我有以下样本数据集:
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中。
我尝试过使用嵌套循环和rbind,但我无法使其正常工作。我还看了很多线程,但是绝大多数只是“重塑”数字,而不是字符,这就是VAR的含义。我怀疑dplyr解决方案是有意义的,但我不能让它工作。谢谢
答案 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="")