2017-03-02 119 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

我實際上實現了這個變體,但我接受了「基礎」解決方案。謝謝 –