关于r:将数据框字符串列拆分为多列

您所在的位置:网站首页 r语言如何将一列数据分成多列 关于r:将数据框字符串列拆分为多列

关于r:将数据框字符串列拆分为多列

2024-07-11 06:20| 来源: 网络整理| 查看: 265

我想获取表格的数据

123456before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))   attr          type 1    1   foo_and_bar 2   30 foo_and_bar_2 3    4   foo_and_bar 4    6 foo_and_bar_2

并在上方的" type"列上使用split()来获得如下信息:

12345  attr type_1 type_2 1    1    foo    bar 2   30    foo  bar_2 3    4    foo    bar 4    6    foo  bar_2

我想出了一些令人难以置信的复杂性,涉及某种形式的apply起作用了,但此后我放错了地方。 似乎太复杂了,无法成为最佳方法。 我可以按以下方式使用strsplit,但不清楚如何将其重新放入数据框中的2列。

123456789101112> strsplit(as.character(before$type),'_and_') [[1]] [1]"foo""bar" [[2]] [1]"foo"  "bar_2" [[3]] [1]"foo""bar" [[4]] [1]"foo"  "bar_2"

感谢您的指导。 我还不太讨厌R列表。

使用stringr::str_split_fixed

12library(stringr) str_split_fixed(before$type,"_and_", 2) 相关讨论 这对于今天的问题也很好用..但是它在每行的开头添加了一个c。知道为什么吗??? left_right ,2) 我想使用具有" ..."的模式进行拆分,当我应用该函数时,它不返回任何内容。可能是什么问题呢。我的类型是"测试...得分" @ user3841581-我知道您的旧查询,但这在文档中已涉及-str_split_fixed("aaa...bbb", fixed("..."), 2)与fixed()配合使用可以很好地在pattern=参数中"匹配固定的字符串"。 .表示正则表达式中的任何字符。 谢谢hadley,一种非常方便的方法,但是有一点可以改进,如果原始列中有NA,则在分离后它将变成结果列中的sevalal空字符串,这是不必要的,我想让NA仍然保持NA后分割 效果很好,即如果缺少分隔符!即,如果我有一个要在列1,1," N"," N"中分开的向量a

另一个选择是使用新的tidyr软件包。

12345678910111213141516library(dplyr) library(tidyr) before %   separate(type, c("foo","bar"),"_and_") ##   attr foo   bar ## 1    1 foo   bar ## 2   30 foo bar_2 ## 3    4 foo   bar ## 4    6 foo bar_2 相关讨论 有没有办法限制使用split分割的数量?可以说我只想在_上拆分一次(或使用str_split_fixed并向现有数据框中添加列)? 是。查看文件

5年后添加强制性data.table解决方案

12345678library(data.table) ## v 1.9.6+ setDT(before)[, paste0("type", 1:2) := tstrsplit(type,"_and_")] before #    attr          type type1 type2 # 1:    1   foo_and_bar   foo   bar # 2:   30 foo_and_bar_2   foo bar_2 # 3:    4   foo_and_bar   foo   bar # 4:    6 foo_and_bar_2   foo bar_2

我们还可以通过添加type.convert和fixed参数来确保生成的列具有正确的类型并提高性能(因为"_and_"并不是正则表达式)

1setDT(before)[, paste0("type", 1:2) := tstrsplit(type,"_and_", type.convert = TRUE, fixed = TRUE)] 相关讨论 如果_and_模式的数量不同,则可以找出与max(lengths(strsplit(before$type, _and_)))匹配的最大数量(即将来的列)

还有另一种方法:在out上使用rbind:

123456789before


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3