如何将具有不等列数的数据框转换为长而整洁的格式?

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() 调用以匹配您的输出,您可以根据自己实际想要的数据排序方式进行调整。