English 中文(简体)
如何从R区长不规则的线段起收集一组数字?
原标题:how to pick up a set of numbers from the end of lines with irregular length in R?
  • 时间:2010-08-31 01:56:38
  •  标签:
  • r
  • string

我需要从时间不正规的线路上收集一些数据,例如:

AAAAAAAAA 250.00
BBB 240.00
CCCCCCC 13.00

我需要抓住250.00、240.00和13.00,但由于数字和特征都是不正规的,我只能为此使用“底线”,我认为解决办法可能不会太大。

谁能帮助? 感谢!

EDIT #1

由于Joshua得到迅速的答复,但我恐怕情况并非如此,因为AAAAAAAAAAAAAAA、BBB、CCCCstring可能也有空间和数字。

再次感谢。

EDIT #2

乔舒亚·伊夫曾尝试过,但至今仍然失败。

 01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 250.00

希望会再次提供帮助和感谢。

EDIT #3

乔舒亚再次表示感谢。

现在我的案件更加复杂:

 01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 834591283405347 250.00

“香港”和“834591283405347”是两个单独的栏目,我希望也加以摘录,我如何能够这样做?

最佳回答

如果你的实际问题与你一样:

> lapply(c("AAAAAAA 250.00","BBB 240.00"), function(x) strsplit(x, " ")[[1]][2]) 
[[1]]
[1] "250.00"

[[2]]
[1] "240.00"

EDIT 1. 由于你的实际问题,实际上 和你一样:

> y <- c("AAAAAAAAAAA 250.00","BBBBB 240.00","CC CC 120.00")
> FUN <- function(x) substr(x,regexpr("[0-9]",x),nchar(x))
> lapply(y,FUN)
[[1]]
[1] "250.00"

[[2]]
[1] "240.00"

[[3]]
[1] "120.00"

EDIT 2: Change FUN to:

> FUN <- function(x) tail(strsplit(x," ")[[1]],1)
问题回答

如果你在每条数据线中只有两栏,可使用<代码>read.table()和textConnection():

x = "AAAAAAAAA 250.00
BBB 240.00
CCCCCCC 13.00"

data = read.table(textConnection(x))

data

             V1  V2
    1 AAAAAAAAA 250
    2       BBB 240
    3   CCCCCCC  13

以及

data[2]
   V2
1 250
2 240
3  13

不幸的是,尾矿相对缓慢。 最终项目的指数实际上要快得多。

FUN <- function(x) {ss <- strsplit(x,   )[[1]];ss[length(ss)]}

在我的机器上,这远远快于尾部的两倍。

y <- c("AAAAAAAAAAA 250.00",
    "01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 5.13",
    "01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 834591283405347 50.00")    

#make y bigger so that there s something to test
y <- rep(y, 1e5)

#testing tail
FUN <- function(x) {tail(strsplit(x,   )[[1]],1)}
system.time( lapply(y,FUN) )       
   user  system elapsed 
 22.108   0.110  22.069 

#testing indexing
FUN <- function(x) {ss <- strsplit(x,   )[[1]];ss[length(ss)]}    
system.time( lapply(y,FUN) )
  user  system elapsed 
 9.396   0.037   9.372 

但是,通过将功能分离和利用组成部分已经成为病媒这一事实,实现更快。 (整个适用的家庭指挥点不是要取代住所,而是允许简单的yn子并尽可能使用病媒控制。) 尽可能最简单的职能应该如实。

#first let strsplit do it s own vectory magic
s <- strsplit(y,    )
#then define a simpler function
FUN <- function(x) x[length(x)]
lapply(s, FUN)

要及时测试,就必须在例行时间内保持分机,使之公平。

system.time( {s <- strsplit(y,    );lapply(s, FUN)} )

   user  system elapsed 
  5.281   0.048   5.305 

(我确信,在指数化名单上没有东西,我的职能应当更加简单)

更有一点,这本来会把事情推向前进,但我在此补充。 斜体有固定的选择。 如果你用定期的表述来确定这一点,就会更快地开展工作。

system.time( {s <- strsplit(y,    , fixed = TRUE); lapply(s, FUN)} )
   user  system elapsed 
  1.256   0.007   1.253 

如果你在大型数据集上重新这样做,或者你不得不经常在中等规模的数据集上这样做,那么你实际上应该采用最后的方法。 速度将近20倍。

这里最后的解决办法是,根据Edit第3号的预期,Y是特征的载体,然后才能完成整个任务。 预计最后一个项目是储蓄的货币价值,第二个项目是某种身份识别价值。

s <- strsplit(y,    , fixed = TRUE)
moneyVal <- lapply(s, function(x) x[length(x)])
   idVal <- lapply(s, function(x) x[length(x)-1])
 restOfY <- lapply(s, function(x) paste(x[1:(length(x)-2)], collapse =    ))
#These three values can be combined into a data frame
df <- data.frame(restOfY, idVal, moneyVal)

我不敢肯定。 但它是否总是“任意文本[空间]编号”?

如果是,你可以做这样的事情。

> read.csv("~/Desktop/test.txt", sep=" ", header=FALSE)
         V1  V2
1 AAAAAAAAA 250
2       BBB 240
3   CCCCCCC  13

假设你将案文保存到档案中(~/Desktop/test.txt)。 这些数字被自动胁迫为数字。

> sum(a$V2)
[1] 503

使用<代码>gsub:

y <- c(
    "AAAAAAAAAAA 250.00",
    "BBBBB 240.00",
    "CC CC 120.00",
    "01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 250.00",
    "01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 834591283405347 250.00"
)

gsub("(^.* )([0-9\.]*$)", "\2", y)
# [1] "250.00" "240.00" "120.00" "250.00" "250.00"

gsub("^.* ", "", y)
# [1] "250.00" "240.00" "120.00" "250.00" "250.00"

Check also this thread about dealing with substrings.

你们应当看看一下子素包,从表面上看是平级功能。

压倒性的职能侧重于你们想要找到的东西(不是你想要区分的东西,也不是你想要清除的东西)。

简单的情况是,只给它一个数字匹配的模式,它会给你从扼杀中得出的所有数字,或者你可以包括一笔费用,以在扼杀结束时只拿到数字,或者修改模式,使之与你想要的完全相称。





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签