当前位置: 首页 > 知识库问答 >
问题:

如何使用R中的separate函数将列拆分为所需的任意多个列,而不是指定?

夹谷飞龙
2023-03-14

我在数据框中有一列数据,该数据框用逗号格式化,如图所示(第一个表)。我可以将其分为三列(第二个表),但是,我希望使用此函数,以便我可以将数据拆分为数据中可能存在的任意多的列,而不必在本例中为第二个表指定5列。我将如何使用此函数或类似函数执行此操作?谢谢

split_data <- separate(df,"M1", c("M1.1","M1.2","M1.3","M1.4","M1.5"), sep = ",", fill = "right")

共有2个答案

葛雪松
2023-03-14
data <- read.table(
textConnection("id  M1
1   blue,green,yellow
2   orange,green
3   orange,purple,blue,pink,white"),header=T)

library(stringr)
library(dplyr)
library(tidyr)


max_size <- data %>% select(M1) %>% pull %>%sapply(function(x) str_count(x,pattern = ',')) %>%max + 1
                                                   
data %>%separate('M1', paste("M1", 1:max_size, sep="."), sep=",", extra="drop")

输出

     id M1.1   M1.2   M1.3   M1.4  M1.5 
  <int> <chr>  <chr>  <chr>  <chr> <chr>
1     1 blue   green  yellow NA    NA   
2     2 orange green  NA     NA    NA   
3     3 orange purple blue   pink  white
徐丰茂
2023-03-14

我推断tidyverse从你使用分离(虽然我不会使用这个函数

library(dplyr)
library(tidyr) # unnest, pivot_wider
df %>%
  mutate(M1 = strsplit(M1, "[,\\s]+")) %>%
  unnest(M1) %>%
  group_by(id) %>%
  mutate(v = paste0("M1.", row_number())) %>%
  pivot_wider(id, names_from = "v", values_from = "M1") %>%
  ungroup()
# # A tibble: 3 x 6
#      id M1.1   M1.2   M1.3   M1.4  M1.5 
#   <int> <chr>  <chr>  <chr>  <chr> <chr>
# 1     1 blue   green  yellow <NA>  <NA> 
# 2     2 orange green  <NA>   <NA>  <NA> 
# 3     3 orange purple blue   pink  white
M1s <- strsplit(df$M1, "[,\\s]+")
M1s <- do.call(rbind, lapply(M1s, `length<-`, max(lengths(M1s))))
colnames(M1s) <- paste0("M1.", seq_len(ncol(M1s)))
cbind(subset(df, select = -M1), M1s)
#   id   M1.1   M1.2   M1.3 M1.4  M1.5
# 1  1   blue  green yellow <NA>  <NA>
# 2  2 orange  green   <NA> <NA>  <NA>
# 3  3 orange purple   blue pink white
library(data.table)
DT <- as.data.table(df)
cbind(DT[, .(id)], DT[, tstrsplit(M1, "[,\\s]+")])
#       id     V1     V2     V3     V4     V5
#    <int> <char> <char> <char> <char> <char>
# 1:     1   blue  green yellow   <NA>   <NA>
# 2:     2 orange  green   <NA>   <NA>   <NA>
# 3:     3 orange purple   blue   pink  white

(然后使用setnames重命名它们)。

数据

df <- structure(list(id = 1:3, M1 = c("blue,green,yellow", "orange,green", "orange,purple,blue,pink,white")), class = "data.frame", row.names = c(NA, -3L))
 类似资料:
  • 本文向大家介绍如何在R中将字符串列拆分为多列?,包括了如何在R中将字符串列拆分为多列?的使用技巧和注意事项,需要的朋友参考一下 这可以在tidyr软件包的帮助下完成。 示例

  • 问题内容: 使用MySQL查询,如何像示例A那样获取表: 并创建一个类似于示例B的视图? 问题答案: 您可以简单地使用函数: 看到这个SQLFiddle 如果您的 班级 数目未知,请尝试此动态查询 输出: 看到这个SQLFiddle

  • 如何将这列列表拆分为两列? 期望的结果:

  • 问题内容: 我的数据库中有一组行,如下所示: 需要的输出: 这将在SQL存储过程中运行。我需要的是在通过CURSOR和4个变量循环更新数据库中的4列时生成的输出。但是正如您所看到的,数据在1列中并且有所不同。 我发现很难理解执行此操作的最佳方法,并希望获得您的帮助。需要帮助请叫我。 我有类似的问题,但我觉得这些并不能给我我所需要的完整答案,或者我认为它不能回答我的问题: 将列字符串拆分为多个列字符

  • 我有: 我想要: 似乎在scala中我可以写:< code>df.select($"value。_1 ",$ "值。_2 ",$ "值。_3"),但这在python中是不可能的。 那么有没有好的办法呢?

  • 它是这样的: 插入some_table(col1,col2,col3,col4) 选择col1、col2、my_func(col3)为new_col3、col4 现在我需要使用相同的逻辑返回两个值而不是一个值。 我可以简单地编写另一个函数来执行相同的逻辑并返回第二个值,但这将是昂贵的,因为该函数从一个大的历史表中进行选择。 我不能与历史表进行连接,因为该函数没有执行简单的select。