我有一个如下所示的数据集:
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
抛出重复值错误....
答案 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 R
和unstack
来创建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)