楼主: dxystata
4032 13

[问答] 数据框某列分成2列 [推广有奖]

11
zerofung 学生认证  发表于 2016-11-19 11:33:30
  1. library(tidyverse)
  2. df <- aaa %>% separate(x1,c("platform","samples"),sep = "(?<=.{10,10000})\\s(?=(\\d+\\sSamples))") %>%
  3.   separate(x2,c("series accession","id"),sep = "ID") %>% mutate(id = paste0("ID",id))
复制代码


这个10到10000是我自己设置的,根据你自己的要求看看倒数第二个空格之前最多有多少个字母,多于那个就好。
另外paste把NA也当成字符串了,如果你需要保留NA就后面再替换,很方便的。

12
dxystata 发表于 2016-11-19 19:35:26
ly_0 发表于 2016-11-18 22:18
"\\s\\d+\\s.+"  能否详细解释一下,谢谢!
x2分隔的正则表达式如何实现?

13
jgchen1966 发表于 2016-11-19 22:34:50
正则表达式,是很繁琐的,不如多编几行程序:
library(tidyrverse)
library(stringr)
library(magrittr)
################################

xda<-data.frame(x1=x1)   ###将x1 放入data.frame 中,x2 同样做法

x<-str_count(xda$x1," ")  ###读取每个观察的空格数,这也确定了其用空格可分的字符串数,如下行:
x<-max(x)+1     ###每个观察的字符串数

xvars<-paste("X",1:x,sep="")  ###建个下面暂用的变量名

  ##以空格为界,将字符分开,没有的在左边用NA 填补
xda%<>%separate(col=x1,into=xvars,sep=" ",fill="left",remove=TRUE)

  rpnaFun<-function(x) ifelse(is.na(x) , "" , x) ###将NA 转为 空格的函数

xda%<>%mutate_each(funs(rpnaFun))  ###将xda 中的每个NA 全转为空格

xda%<>%mutate(V1=paste(X1,X2,X3,X4,X5,X6,sep=" "),
                                    V2=paste(X7,X8,sep=" "))%>%  ##求两个想要的变量值,这显得不太自主??
       dplyr::select(V1,V2)%>%              ###只保留相要的二个变量
       mutate(V1=str_trim(V1,side="left"),V2=str_trim(V2,side="left")   ###将左边可能存在空格删除

#############################


鹑居鷇食,鸟行无彰

14
ly_0 发表于 2016-11-20 09:57:13
dxystata 发表于 2016-11-19 19:35
"\\s\\d+\\s.+"  能否详细解释一下,谢谢!
x2分隔的正则表达式如何实现?
"\\s"表示空格,"\\d"表示数字,"+"表示其前一个字符有1个或多个,"."表示任意字符,所以这串字符表示的就是"1个空格+1个或多个数字+一个空格+1个或多个任意字符",就能匹配出后面第二列的内容。对于x2应该可以这样:"ID:\\d+"。正则表达式很灵活,但是内容长了之后看起来会很痛苦。。。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 07:42