【问题标题】:In R, can you separate text to columns so that values align? [duplicate]在 R 中,您可以将文本分隔到列以使值对齐吗? [复制]
【发布时间】:2021-06-01 11:42:55
【问题描述】:

我有一个文本值向量,例如:

Col1
camel; cow; giraffe; panda; zebra
camel; giraffe; zebra
panda; zebra

我想将这些值分成相等数量的列,以便这些值在同一列中垂直对齐,NA 有间隙,这样我得到:

Col1, Col2, Col3, Col4, Col5
camel, cow, giraffe, panda, zebra
camel, NA, giraffe, NA, zebra
NA, NA, NA, panda, zebra

我怎样才能做到这一点?我尝试在 dplyr 中使用“分离”函数,但这会返回错误消息,而在 splitshapestack 中使用“拆分”函数允许我分隔列,但它们不会返回垂直对齐的值。我也尝试过以与this post 类似的方式使用“lapply”和“match”,但我仍然不断收到错误消息。

【问题讨论】:

  • 检查splitstackshape::cSplit_e:cSplit_e(d, "Col1", "; ", type = "character", mode = "value", fill = NA, drop = TRUE)

标签: r dplyr csv


【解决方案1】:

您可以多次旋转数据以对齐这些值:

library(dplyr)

df %>% 
  tibble::rowid_to_column("id") %>% 
  tidyr::separate_rows(Col1, sep = "; ") %>% 
  tidyr::pivot_wider(id_cols = id,
                     names_from = Col1,
                     values_from = Col1) %>% 
  dplyr::select(-id) %>% 
  magrittr::set_colnames(paste0("Col", 1:ncol(.)))

输出

 Col1  Col2  Col3    Col4  Col5 
  <chr> <chr> <chr>   <chr> <chr>
1 camel cow   giraffe panda zebra
2 camel NA    giraffe NA    zebra
3 NA    NA    NA      panda zebra

工作原理

  1. rowid_to_column 会跟踪行号,因此当数据转换为更长的格式时,我们不会忘记哪些值属于哪些行。
  2. separate_rows 将分隔 Col1 并将数据转换为更长的格式。 @Adam 建议作为改进。
  3. pivot_wider 将所有内容对齐到您指定的列中。

数据

structure(list(Col1 = c("camel; cow; giraffe; panda; zebra", 
"camel; giraffe; zebra", "panda; zebra")), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • 您也可以使用separate_rows() 保存pivot_longer() 步骤。
  • 您将忘记哪些值属于哪些行。
  • 如果你把它放在rowid_to_column() 步骤之后就不行!
  • 好点!感谢您的建议。
  • @LMc 谢谢! “工作原理”非常有用,但我尝试运行您的代码,但收到一条错误消息:“错误:必须命名 2312 列。使用 .name_repair 指定修复。”知道为什么会这样吗?
猜你喜欢
  • 2020-01-24
  • 1970-01-01
  • 2020-12-16
  • 2020-02-28
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2022-06-10
相关资源
最近更新 更多