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中根据特定字符将一列拆分为几列的方法的主要内容,如果未能解决你的问题,请参考以下文章