6

次のような数値の列を含むデータフレームがあります。

360010001001002
360010001001004
360010001001005
360010001001006

2 桁、3 桁、5 桁、1 桁、4 桁のチャンクに分割したい:

36 001 00010 0 1002
36 001 00010 0 1004
36 001 00010 0 1005
36 001 00010 0 1006

それは簡単なように思えますが、私は strsplit のドキュメントを読んでいて、長さでこれを行う方法を整理できません。

4

5 に答える 5

8

使用できますsubstring(文字列/数値の長さが固定されていると仮定します):

xx <- c(360010001001002, 360010001001004, 360010001001005, 360010001001006)
out <- do.call(rbind, lapply(xx, function(x) as.numeric(substring(x, 
                     c(1,3,6,11,12), c(2,5,10,11,15)))))
out <- as.data.frame(out)
于 2013-05-07T22:14:53.523 に答える
4

機能バージョン:

split.fixed.len <- function(x, lengths) {
   cum.len <- c(0, cumsum(lengths))
   start   <- head(cum.len, -1) + 1
   stop    <- tail(cum.len, -1)
   mapply(substring, list(x), start, stop)
}    

a <- c(360010001001002,
       360010001001004,
       360010001001005,
       360010001001006)

split.fixed.len(a, c(2, 3, 5, 1, 4))
#      [,1] [,2]  [,3]    [,4] [,5]  
# [1,] "36" "001" "00010" "0"  "1002"
# [2,] "36" "001" "00010" "0"  "1004"
# [3,] "36" "001" "00010" "0"  "1005"
# [4,] "36" "001" "00010" "0"  "1006"
于 2013-05-07T22:32:54.423 に答える
0

(うわー、この作業はPythonに比べて信じられないほど不格好で骨の折れる作業です。とにかく...)

PSあなたの主な意図は、部分文字列の長さのベクトルをインデックスのペアに変換することでした。を使用cumsum()して、インデックスをまとめて並べ替えることができます。

ll <- c(2,3,5,1,4)
sort( c(1, cumsum(ll), (cumsum(ll)+1)[1:(length(ll)-1)]) )
# now extract these as pairs.

でもかなり痛いです。それに対するflodelの答えの方が優れています。

df 列に分割し、それを効率的に行う実際のタスクについては、次のとおりです。

stringr::str_sub()plyr::ddply()/とエレガントに組み合わせるldply

require(plyr)
require(stringr)

df <- data.frame(value=c(360010001001002,360010001001004,360010001001005,360010001001006))
df$valc = as.character(df$value)

df <- ddply(df, .(value), mutate, chk1=str_sub(valc,1,2), chk3=str_sub(valc,3,5), chk6=str_sub(valc,6,10), chk11=str_sub(valc,11,11), chk14=str_sub(valc,12,15) )

#             value            valc chk1 chk3  chk6 chk11 chk14
# 1 360010001001002 360010001001002   36  001 00010     0  1002
# 2 360010001001004 360010001001004   36  001 00010     0  1004
# 3 360010001001005 360010001001005   36  001 00010     0  1005
# 4 360010001001006 360010001001006   36  001 00010     0  1006
于 2014-03-09T15:18:50.003 に答える