如何将具有不等列数的数据框转换为长而整洁的格式?
How can you turn to a long, tidy format a dataframe with unequal number of columns?
我有一个很大的 excel 电子表格,其中行的列数不相等。列名重复,这些列以各种格式(数字、字符、日期等)存储数据。如何将这些数据重塑为长而整洁的格式?
这是我的数据框的样子
df <- tibble(id = c("T1", "T2", "T3"), x = c(4:6), y = c("A", "B", "C"), x = c(7, 8, NA), y = c("A", "B", NA), x = c(NA, 4, NA), y= c(NA, "F", NA), .name_repair = "minimal")
df
我想要这种类型的输出
ID
X
Y
T1
4
A
T1
7
A
T2
5
B
T2
8
B
T2
4
F
T3
6
C
非常感谢您的帮助!
您无需在此处转置,只需分别为每组列绑定行即可。您可以手动执行此操作:
library(tidyverse)
bind_rows(
df[,1:3],
df[,c(1,4:5)],
df[,c(1,6:7)]
)
然后只过滤掉具有 NA
值的行。如果您有额外的列来执行此操作,则可以改为在数字向量上使用 purrr::map_dfr
进行列索引以自动 select 正确的列,然后将它们绑定在一起。然后只需使用 dplyr::filter(across(...)
删除所有 NA
.
的行
map_dfr(
seq(2,6,2),
~df[, c(1, .x, .x + 1)]
) %>%
filter(across(c(x,y), ~ !is.na(.x))) %>%
arrange(id, y, x)
#> # A tibble: 6 × 3
#> id x y
#> <chr> <dbl> <chr>
#> 1 T1 4 A
#> 2 T1 7 A
#> 3 T2 5 B
#> 4 T2 8 B
#> 5 T2 4 F
#> 6 T3 6 C
我添加了最终的 dplyr::arrange()
调用以匹配您的输出,您可以根据自己实际想要的数据排序方式进行调整。
我有一个很大的 excel 电子表格,其中行的列数不相等。列名重复,这些列以各种格式(数字、字符、日期等)存储数据。如何将这些数据重塑为长而整洁的格式?
这是我的数据框的样子
df <- tibble(id = c("T1", "T2", "T3"), x = c(4:6), y = c("A", "B", "C"), x = c(7, 8, NA), y = c("A", "B", NA), x = c(NA, 4, NA), y= c(NA, "F", NA), .name_repair = "minimal")
df
我想要这种类型的输出
ID | X | Y |
---|---|---|
T1 | 4 | A |
T1 | 7 | A |
T2 | 5 | B |
T2 | 8 | B |
T2 | 4 | F |
T3 | 6 | C |
非常感谢您的帮助!
您无需在此处转置,只需分别为每组列绑定行即可。您可以手动执行此操作:
library(tidyverse)
bind_rows(
df[,1:3],
df[,c(1,4:5)],
df[,c(1,6:7)]
)
然后只过滤掉具有 NA
值的行。如果您有额外的列来执行此操作,则可以改为在数字向量上使用 purrr::map_dfr
进行列索引以自动 select 正确的列,然后将它们绑定在一起。然后只需使用 dplyr::filter(across(...)
删除所有 NA
.
map_dfr(
seq(2,6,2),
~df[, c(1, .x, .x + 1)]
) %>%
filter(across(c(x,y), ~ !is.na(.x))) %>%
arrange(id, y, x)
#> # A tibble: 6 × 3
#> id x y
#> <chr> <dbl> <chr>
#> 1 T1 4 A
#> 2 T1 7 A
#> 3 T2 5 B
#> 4 T2 8 B
#> 5 T2 4 F
#> 6 T3 6 C
我添加了最终的 dplyr::arrange()
调用以匹配您的输出,您可以根据自己实际想要的数据排序方式进行调整。