【问题标题】:Long to wide with no unique key长到宽,没有唯一键
【发布时间】:2017-07-22 11:23:57
【问题描述】:

我有这个数据集:

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]

我没有得到我想要的东西。

但我需要的是:

我该如何做到这一点?

【问题讨论】:

  • 你可以通过data.tabledcast(setDT(df), rowid(VAR)~VAR)轻松做到这一点

标签: r dataframe data-manipulation tidyr


【解决方案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

【讨论】:

  • 我实际上实现了这个变体,但我接受了“基本”解决方案。谢谢
【解决方案2】:

你可以在 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}))

【讨论】:

  • 使用base 是对的……我根据spread 的使用假设tidyverse 组件。基于microbenchmark(...),这也快了约 10 倍。
  • 在此数据上,速度无关紧要 - 两者都将接近瞬时。问题是在足够大的数据上,什么速度更快,差异会很明显。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多