(Un)tidy 具有不等大小和重复变量的数据集

(Un)tidy a dataset with unequal sizes and duplicate variables

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

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 抛出重复值错误....

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 列。

使用 dplyr,tidyr::complete,::传播

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

我们可以用 base Runstack 来创建一个 list,然后在末尾用 NA 填充以使每个 [= 的长度相同14=] 元素并转换为 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