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

时间:2016-08-12 21:07:53

标签: r tidyr

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

我们可以使用base Runstack来创建list,然后在末尾填充NA以使每个{{1}的长度相同} element并转换为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))

答案 2 :(得分:0)

使用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)