如何将数字拆分为R中的数字

jrs*_*s-x 24 split r dataframe

我有一个带有数字ID变量的数据框,用于从多级采样方案中识别主要,次要和终极采样单元.我想将原始ID变量拆分为三个新变量,分别识别不同的采样单元:

例:

>df[1:2,]
ID Var        var1     var2      var3     var4         var5  
501901          9    SP.1          1        W         12.10    
501901          9    SP.1          2        W         17.68  
Run Code Online (Sandbox Code Playgroud)

我想要的是:

>df[1:2,]
ID1    ID2     ID3   var1   var2  var3     var4    var5  
5      01      901    9    SP.1    1        W     12.10    
5      01      901    9    SP.1    2        W     17.68  
Run Code Online (Sandbox Code Playgroud)

我知道R中有一些功能可以分割字符串,但我找不到相同的数字设施.

谢谢,

胡安

EDi*_*EDi 21

您可以使用例如使用substring:

df <- data.frame(ID = c(501901, 501902))

splitted <- t(sapply(df$ID, function(x) substring(x, first=c(1,2,4), last=c(1,3,6))))
cbind(df, splitted)
#      ID 1  2   3
#1 501901 5 01 901
#2 501902 5 01 902
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 13

然而,另一个替代方案是使用重新读取的第一列read.fwf和指定的宽度:

cbind(read.fwf(file = textConnection(as.character(df[, 1])), 
               widths = c(1, 2, 3), colClasses = "character", 
               col.names = c("ID1", "ID2", "ID3")), 
      df[-1])
#   ID1 ID2 ID3 var1 var2 var3 var4  var5
# 1   5  01 901    9 SP.1    1    W 12.10
# 2   5  01 901    9 SP.1    2    W 17.68
Run Code Online (Sandbox Code Playgroud)

这里的一个优点是能够以方便的方式设置结果列名称,并确保列是字符,从而保留可能存在的任何前导零.


Rco*_*ter 5

这应该工作:

df <- cbind(do.call(rbind, strsplit(gsub('(.)(..)(...)', '\\1 \\2 \\3', paste(df[,1])),' ')), df[,-1]) # You need that paste() there because gsub() works only with text.
Run Code Online (Sandbox Code Playgroud)

或者 substr()

df <- cbind(ID1=substr(df[, 1],1,1), ID2=substr(df[, 1],2,3), ID3=substr(df[, 1],4,6), df[, -1])
Run Code Online (Sandbox Code Playgroud)