R中根据特定字符将一列拆分为几列的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R中根据特定字符将一列拆分为几列的方法相关的知识,希望对你有一定的参考价值。

参考技术A R中根据匹配原则将一列拆分为几列的方法

例如我们需要将一下数据的第二列从and处拆分为两列:

before = 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

==>

  attr type_1 type_2

1    1    foo    bar

2  30    foo  bar_2

3    4    foo    bar

4    6    foo  bar_2

1. 使用stringr包的str_split_fixed函数

library(stringr)

str_split_fixed(before$type, "_and_", 2)

2. 使用do.call函数 (do.call(what, args, quote = FALSE, envir = parent.frame()))

before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2')) 

out <- strsplit(as.character(before$type),'_and_')

do.call(rbind, out)

3. 使用tidyr包

library(dplyr)

library(tidyr)

before <- data.frame(attr = c(1, 30 ,4 ,6 ), type = c('foo_and_bar', 'foo_and_bar_2'))

before %>% separate(type, c("foo", "bar"), "_and_")

4. 使用sapply 以及 "["

before$type_1 < sapply(strsplit(as.character(before$type),'_and_'), "[", 1)

before$type_2 < sapply(strsplit(as.character(before$type),'_and_'), "[", 2)

或者

before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))

after <- with(before, data.frame(attr = attr))

after <- cbind(after, data.frame(t(sapply(out, `[`))))names(after)[2:3] <- paste("type", 1:2, sep = "_")

5. 使用unlist后重新划分矩阵

before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))

tmp <- matrix(unlist(strsplit(as.character(before$type), '_and_')), ncol=2,byrow=TRUE) #you should show how many columns you would get after spliting

after <- cbind(before$attr, as.data.frame(tmp))names(after) <- c("attr", "type_1", "type_2")

标签: R

使用 r 将一列拆分为两列 [重复]

【中文标题】使用 r 将一列拆分为两列 [重复]【英文标题】:split a column to two columns using r [duplicate] 【发布时间】:2017-12-16 20:16:33 【问题描述】:

我想用 ')*(' 将 V2 列分成两列

V1                                  V2
r1      (Direct)*(Mary*(Sewnf 45*S-a))
r2 (Ax 70a12*Qunion)*(Kin - 32431*Tip)
r3           (PAN*Q-23)*(BE 05/514/10)

然后我可以看到下面。

V1                V2                          V3
r1           (Direct        Mary*(Sewnf 45*S-a))
r2  (Ax 70a12*Qunion            Kin - 32431*Tip)
r3         (PAN*Q-23               BE 05/514/10)

这是我尝试过的方法,但显然它没有达到我的目标。

library(stringr)
str_split_fixed(as.character(data$V2), '\\)*(', 2)
str_split_fixed(as.character(data$V2), '\\)*\\(', 2)

也在尝试。

strsplit(as.character(data$V2), '\\)*(')

如何修改我的脚本?

【问题讨论】:

【参考方案1】:

我们可以使用separate 来执行此操作,方法是指定sep 以匹配),后跟*((这些是元字符,即() 可用于作为一个组进行捕获而*意味着0个或多个字符,所以需要转义(\\)来解析文字字符。使用extra=merge,它只在这个匹配的第一个实例处拆分,其他的合并到第二列即'V3'

library(tidyr)
separate(df1, V2, into = c("V2", "V3"), "\\)\\*\\(", extra = "merge")
#  V1               V2                   V3
#1 r1          (Direct Mary*(Sewnf 45*S-a))
#2 r2 (Ax 70a12*Qunion     Kin - 32431*Tip)
#3 r3        (PAN*Q-23        BE 05/514/10)

在 OP 的代码中,所有的元字符都没有转义

【讨论】:

【参考方案2】:
library(stringr)
data[,c("V2","V3")] <- str_split_fixed(as.character(data$V2), ")*(", 2)

这应该可行!

【讨论】:

以上是关于R中根据特定字符将一列拆分为几列的方法的主要内容,如果未能解决你的问题,请参考以下文章

将一列字符串拆分为几列[重复]

熊猫通过根据另一列的值添加列级别来重塑数据框[重复]

R语言选择特定的行,对某一列排序

Bigquery:如何根据特定时间范围聚合几列的数据?

根据分隔符拆分列,然后在保留其他列的情况下取消透视结果

如何根据另一列值将一列分成多个?