2017-03-02 118 views
0

我有这样的数据集:龙宽,没有唯一的密钥

VAR=  c('X1','X1','X1','X1','X2','X2','X2','X3','X3','X3','X3','X3') 
Ranking= c(1,2.5 ,2.5 ,1.5 ,1.5 ,NA, 1 ,NA ,NA ,1.5 ,1.5 ,3) 
df<-data.frame(VAR,Ranking) 

对于那些即使我添加了一个唯一的标识符,传播

df$row <- 1:nrow(df) 
df_wide<-spread(df, VAR, Ranking) 
df_wide<-df_wide[,-1] 

我没有得到我所追求的。

This is what I get

但我需要的是:

enter image description here

如何做到这一点?

+0

您可以轻松地用''data.table' dcast(setDT(DF做到这一点),ROWID (VAR)〜VAR)' – akrun

回答

3

可以在R基本做到:

spl <- split(df, df$VAR) 
n <- max(sapply(spl, nrow)) 
do.call(cbind, lapply(spl, function(x) { 
    x <- x[!is.na(x$Ranking),'Ranking'] 
    length(x) <- n 
    x})) 
+1

你有权利用'base'去......我基于'spread'的使用假设了'tidyverse'组件。基于'microbenchmark(...)',这也快了10倍。 – r2evans

+0

在这个数据上,速度是无关紧要的 - 两者都将接近瞬时。问题在于数据的速度要快得多,差距才会明显。 – Gregor

1

您的方法非常接近,但通过在所有行中设置唯一的,您可以保证这些行不会按照您的意图“真正加入”。相反,它们编号内VAR,然后蔓延:

library(dplyr) 
library(tidyr) 
group_by(df, VAR) %>% 
    mutate(Row = row_number()) %>% 
    ungroup() %>% 
    spread(VAR, Ranking) 
# # A tibble: 5 × 4 
#  Row X1 X2 X3 
# * <int> <dbl> <dbl> <dbl> 
# 1  1 1.0 1.5 NA 
# 2  2 2.5 NA NA 
# 3  3 2.5 1.0 1.5 
# 4  4 1.5 NA 1.5 
# 5  5 NA NA 3.0 
+0

我实际上实现了这个变体,但我接受了“基础”解决方案。谢谢 –