(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 R
和 unstack
来创建一个 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
我有一个如下所示的数据集:
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 R
和 unstack
来创建一个 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