2012-06-03 54 views
2

我试图分裂的40位数字字符串(即分裂成1234567891234567891234567891 2 3 4R:分裂

可惜strsplit不起作用,因为它需要的字符,并转换串数字字符串使用as.character不起作用,因为它很长,R会自动切断长数字的小数(最多22位小数)。因此,我最终以"1.2345e+35"作为字符串,而不是完整的数字。

是否有数字变体strsplit,或解决小数切断问题?我似乎无法找到stackoverflow上的答案,但道歉,如果这已经被回答过。提前致谢!

+0

你以什么格式开头?字符或数字? –

+0

它是数字,这就是为什么'strsplit'给出错误 – user1092247

+2

,但是如果你处理的是一个非常大的数值,R可能已经失去了精度。 'options(“digits”)'的最大值是22;我不确定R可以在'numeric'变量中保持的最大精度,但我认为你的值比这大。您可能需要查看一些关于任意精确算术选项的SO答案(主要涉及非R工具的接口,例如'bc'):例如http://stackoverflow.com/questions/8175965/multiplication- in-large-ingers-in-r –

回答

5

如果R计算的数字我不知道解决方案。如果数字在数据文件中,我认为下面的代码可能工作。尽管如果数字在数据文件中,那么可能有更简单的解决方案。

a1 <- read.table("c:/users/Mark W Miller/simple R programs/long_number.txt", colClasses = 'character') 

# a1 <- c('1234567891234567891234567891234567891234') ; 

a1 <- as.character(a1) ; 
a2 <- strsplit(a1, "") ; 
a3 <- unlist(a2) ; 
a4 <- as.vector(as.numeric(a3)) ; 
a4 
# [1] 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 

编辑

我意识到我可能不明白的问题,我的答案很可能是非常愚蠢的。尽管如此,如果你有一个完整的数据集,那么你可以用下面的代码分割所有的数据。请注意,有“three_long_numbers.txt”的文件中没有报价,并且数据开始作为数字:

a1 <- read.table("c:/users/Mark W Miller/simple R programs/three_long_numbers.txt", colClasses = 'character') 
a1 

#  V1           
# [1,] "1234567891234567891234567891234567891234" 
# [2,] "1888678912345678912345678912345678912388" 
# [3,] "1234999891234567891234567891234567891239" 

# a1 <- matrix(c(
# "1234567891234567891234567891234567891234", 
# "1888678912345678912345678912345678912388", 
# "1234999891234567891234567891234567891239"), nrow=3, byrow=T) 

a1 <- as.matrix(a1) ; 
a2 <- strsplit(a1, "") ; 
a3 <- unlist(a2) ; 
a3 <- as.numeric(a3) ; 
a4 <- matrix(a3, nrow=dim(a1)[1], byrow=T) 
a4 
0

这里是另一种方法,这似乎更直接的比从一年前我的回答:

拆分单个载体:

a1 <- c('1234567891234567891234567891234567891234') 
a2 <- read.fwf(textConnection(a1), widths=rep(1, nchar(a1)), colClasses = 'numeric', header=FALSE) 
a2 
    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 

读取一个文件含有相等的长度以下三个长的数字:

# 1234567891234567891234567891234567891234 
# 1888678912345678912345678912345678912388 
# 1234999891234567891234567891234567891239 

a1 <- read.table("c:/users/mmiller21/simple R programs/three_long_numbers.txt", colClasses = 'character', header = FALSE) 
a2 <- read.fwf("c:/users/mmiller21/simple R programs/three_long_numbers.txt", widths=rep(1, max(nchar(a1$V1))), colClasses = 'numeric', header=FALSE) 
a2 

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 8 
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 9 

读取文件含有不等长度的以下三个长的数字:

# 1234567891234567891234567891234567891234 
# 188867891234567891234567891234567891238 
# 12349998912345678912345678912345678912 

a1 <- read.table("c:/users/mmiller21/simple R programs/three_long_numbersb.txt", colClasses = 'character', header = FALSE) 
a2 <- read.fwf("c:/users/mmiller21/simple R programs/three_long_numbersb.txt", widths=rep(1, max(nchar(a1$V1))), colClasses = 'numeric', header=FALSE) 
a2 

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 NA 
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 NA NA 

这里是代码中包含多个列的数据文件分割长数字的一列。在这个例子中的第2列每个数字都有相同的长度:

# -10 1234567891234567891234567891234567891234 -100 
# -20 1888678912345678912345678912345678912388 -200 
# -30 1234999891234567891234567891234567891239 -300 

a1 <- read.table("c:/users/mark w miller/simple R programs/three_long_numbers_Oct25_2013.txt", colClasses = c('numeric', 'character', 'numeric'), header = FALSE) 
a2 <- read.fwf(textConnection(a1$V2), widths=rep(1, nchar(a1$V2)[1]), colClasses = 'numeric', header=FALSE) 
    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 
2 1 8 8 8 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 8 8 
3 1 2 3 4 9 9 9 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 9 
2

你可以简单地做拆分为数值向量:

s <- "123456789123456789123456789" 
as.numeric(strsplit(s,"")[[1]]) 

# [1] 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 

,或者如果你希望他们分裂为特征向量:

strsplit(s,"")[[1]] 

# [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "1" "2" "3" "4" "5" "6" "7" "8" 
# "9" "1" "2" "3" "4" "5" "6" 
# [25] "7" "8" "9"