将R中的多列数据框透视为一列,并拆分原始列名

xjreopfe  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(146)

我的数据是一个更复杂,但简化它基本上看起来像这样。每一行只有一个是在多个颜色:* 列之一。冒号前的"颜色"需要是新的列名,与命名的颜色"蓝色","红色",或"绿色"后的冒号下旋转到正确的"标识"我忘了提有变量列之前和之后的这些多个列我想要旋转到一个列。我想要旋转的列都有相同的名称之前的冒号。
| 身份|颜色:蓝色|颜色:红色|颜色:绿色|
| - ------| - ------| - ------| - ------|
| 1个|||是的|
| 第二章|是的|||
| 三个||是的||
我想把重点放在
| 身份|颜色|
| - ------| - ------|
| 1个|绿色|
| 第二章|蓝色|
| 三个|红色|
我不确定这是否是一个透视问题。我已经通读了tidyr透视文档,位于
https://tidyr.tidyverse.org/articles/pivot.html
我没有看到类似的例子或能够确定一个解决方案,可能与我提供的数据工作。
有谁能帮我一个代码块,我可以按照它来解决表面上看起来很简单的问题,但我对R. Thank you和Seasons Blessings的有限熟练程度却无法解决

czq61nw1

czq61nw11#

我们可以通过循环across字符列将character列中的空格("")转换为NA,然后通过选择列名为starts_with "Color:"的cols将其整形为"long"。

library(tidyr)
library(dplyr)
df1 %>%
   mutate(across(where(is.character), ~ na_if(.x, ""))) %>% 
   pivot_longer(cols = starts_with("Color:"), names_to = c(".value", "Color2"), 
     names_sep = ":", values_drop=TRUE) %>% 
  select(IDENTITY, Color = Color2)
  • 输出
# A tibble: 3 × 2
  IDENTITY Color
     <int> <chr>
1        1 Green
2        2 Blue 
3        3 Red
tcomlyy6

tcomlyy62#

您需要使用pivot_longer函数,它将收集列并将它们转换为行。

注意:我必须把````放在列名前面,因为:是R中那些讨厌的保留字符之一。您希望避免将其作为列分隔符(_可能是一个有用的替代)。您不能总是控制这一点,但它只是需要注意的事情。

library(tidyverse)

x <- tribble( ~IDENTITY, ~`Color:Blue`, ~`Color:Red`, ~`Color:Green`,
              1L, "", "", "Yes",
              2L, "Yes", "", "",
              3L, "" , "Yes", "")

x %>%
  rename_with(stringr::str_replace,
              pattern = "Color:",
              replacement = "") %>%
  pivot_longer(!IDENTITY,
               names_to = "Color") %>%
  filter(value != "") %>%
  select(!value)

相关问题