我在数据框中有一列数据,该数据框用逗号格式化,如图所示(第一个表)。我可以将其分为三列(第二个表),但是,我希望使用此函数,以便我可以将数据拆分为数据中可能存在的任意多的列,而不必在本例中为第二个表指定5列。我将如何使用此函数或类似函数执行此操作?谢谢
split_data <- separate(df,"M1", c("M1.1","M1.2","M1.3","M1.4","M1.5"), sep = ",", fill = "right")
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
我推断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列中并且有所不同。 我发现很难理解执行此操作的最佳方法,并希望获得您的帮助。需要帮助请叫我。 我有类似的问题,但我觉得这些并不能给我我所需要的完整答案,或者我认为它不能回答我的问题: 将列字符串拆分为多个列字符
它是这样的: 插入some_table(col1,col2,col3,col4) 选择col1、col2、my_func(col3)为new_col3、col4 现在我需要使用相同的逻辑返回两个值而不是一个值。 我可以简单地编写另一个函数来执行相同的逻辑并返回第二个值,但这将是昂贵的,因为该函数从一个大的历史表中进行选择。 我不能与历史表进行连接,因为该函数没有执行简单的select。
问题内容: 在基本的Postgres函数教程中,有一个带有如下参数的示例: 然后结果看起来像 但是,假设您要在执行连接所产生的列上执行该函数,并且您无权修改该函数或使用替代函数?例如,使用一些玩具数据: 在单列“ hi_lo”中返回具有2元组值的结果。 将查询括在括号中并尝试从中查询不会更改输出的格式。所以 不会影响结果形状。 以下尝试导致错误“子查询必须仅返回一列” 最后,我也尝试过,但是由于元