R如何创建包含子字符串

时间:2016-06-18 18:28:36

标签: r substr

我的数据文件包含一个变量,可以回答几个问题。

结构是:

ID response
1  BCCAD
2  ABCCD
3  BA.DC
.....

我想在新变量q1,q2,..中分隔每个响应:

ID q1 q2 q3 q4 q5
1  B  C  C  A  D
2  A  B  C  C  D
3  B  A  .  D  C
....

我尝试了以下代码

 v <- rep("q",5)
 z <- as.character(1:5)
 paste(v,z,sep="")
 for(i in 1:20){
 f[i]<- substr(response,i,i)
 }

但它只替换了向量中的变量名。

我打算根据需要创建尽可能多的变量来存储每个问题的值。变量应使用公共根,&#34; q&#34;以及显示字符串中位置的下标命名。

3 个答案:

答案 0 :(得分:3)

您可以使用strsplit功能:

DF <- 
read.csv(text="ID,response
1,BCCAD
2,ABCCD
3,BA.DC",header=TRUE)

DF2 <- cbind(DF['ID'], do.call(rbind,strsplit(as.character(DF$response),"")))

names(DF2)[-1] <- paste0('q',1:(ncol(DF2)-1))

> DF2
  ID q1 q2 q3 q4 q5
1  1  B  C  C  A  D
2  2  A  B  C  C  D
3  3  B  A  .  D  C

请注意,仅当响应列中的所有字符串具有相同的字符数时,此方法才有效。

答案 1 :(得分:1)

其他几个选项:

1) separate包中的tidyr函数:

library(tidyr)
# notation 1:
separate(d, col=response, into=paste0('q',1:5), sep=1:4)
# notation 2:
d %>% separate(col=response, into=paste0('q',1:5), sep=1:4)

2) tstrsplit包中的data.table函数:

library(data.table)
setDT(d)[, paste0('q',1:5) := tstrsplit(response, split = '')][, response := NULL][]

3) cSplit的{​​{1}}函数与splitstackshape的{​​{1}}结合使用:

setnames

都给出了相同的结果:

data.table

使用过的数据:

library(splitstackshape)
setnames(cSplit(d, 'response', sep='', stripWhite=FALSE), 2:6, paste0('q',1:5))[]

答案 2 :(得分:0)

这是一种方式:

df=data.frame(ID=1:3,response=c("BCCAD","ABCCD","BA.DC"))
response.split <- as.data.frame(do.call("rbind",lapply(split(df$response,df$ID),FUN=function(vec){strsplit(as.character(vec),"")[[1]]})))
names(response.split) <- paste("q",1:ncol(response.split),sep="")
out <- cbind(ID=df$ID,response.split)
out

  ID q1 q2 q3 q4 q5
1  1  B  C  C  A  D
2  2  A  B  C  C  D
3  3  B  A  .  D  C