【问题标题】:(Un)tidy a dataset with unequal sizes and duplicate variables(不)整理大小不等且变量重复的数据集
【发布时间】:2016-08-12 21:07:52
【问题描述】:

我有一个如下所示的数据集:

df <- data.frame(
    x = c(rep("A", 3), rep("B", 2)), 
    y = c(1, 2, 6, 8, 3)
)

我需要(不)整理它,使它看起来像这样:

df_new <- data.frame(
    A = c(1, 2, 6),
    B = c(8, 3, NA)
)

tidyr::spread 抛出重复值错误....

【问题讨论】:

  • 大多数人会认为您的数据按原样整洁,而您对它所做的事情是“不整洁的”,
  • 哈。我猜你是对的。那我需要整理一下吗?

标签: r tidyr


【解决方案1】:

tidyr(据我所知)不会让您在没有 ID 列的情况下执行此操作。所以我们先添加,然后传播:

library(dplyr)
library(tidyr)

df %>% group_by(x) %>% 
    mutate(id = 1:n()) %>%
    spread(key = x, value = y, fill = NA)
# # A tibble: 3 x 3
#      id     A     B
# * <int> <dbl> <dbl>
# 1     1     1     8
# 2     2     2     3
# 3     3     6    NA

如果您愿意,当然可以删除末尾的 id 列。

【讨论】:

  • 该死的。我刚想通,但你打败了我。无论如何,您的解决方案要优雅得多。谢谢!
  • 1:n() 可能更短,但 row_number() 更具可读性;-)
【解决方案2】:

我们可以使用base Runstack 来创建list,然后在末尾填充NA 以使每个list 元素的长度相同并转换为data.frame

lst <- unstack(df, y~x)
data.frame(lapply(lst, `length<-`, max(lengths(lst))))
#  A  B
#1 1  8
#2 2  3
#3 6 NA

或者如果我们使用一个包,一个紧凑的选项会是

library(stringi)
stri_list2matrix(split(df$y, df$x))

输出将是字符串,可以更改为numeric

【讨论】:

    【解决方案3】:

    使用 dplyr、tidyr::complete、::spread

    df_new <- df %>%
        group_by(x) %>% 
        mutate(index = row_number()) %>% 
        complete(index = 1:max(index)) %>% 
        spread(x, y, fill = NA) %>% 
        select(-index)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多