长到宽,没有独特的钥匙

时间:2017-03-02 16:13:11

标签: r dataframe data-manipulation tidyr

我有这个数据集:

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

我如何做到这一点?

2 个答案:

答案 0 :(得分:3)

你可以在R base做:

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 :(得分:1)

您的方法很接近,但是通过使Row在所有行中都是唯一的,您可以保证这些行不会以您想要的方式“加入”。相反,将它们编号在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