从长到宽,带有角色扭曲
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="")
我有一个看起来像 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="")