2016-06-16 11 views
1

文字ベクトルxは、ソースから目的地までのフライトに関するツイートを運賃で含んでいます。それは以下のようになります。データフレーム内の行からドル値を抽出し、それぞれの行に貼り付ける方法

x <- c('RT @airfarewatchdog: Los Angeles Los Angeles LAX to Cabo #SJD for $234', 
     'RT @TheFlightDeal: Airfare Deal: [AA] New York - Mexico City, Mexico. $270', 
     'SOME JUNK HERE', 
     'RT @airfarewatchdog: Los Angeles Los Angeles LAX to New York') 

私は基本的にソースと各行からの運賃と目的地の都市を抽出しようとすると、別の変数にそれを格納しています。

私のコードは以下のようになります。

toMatch <- (data$City_Airport) 
a <- sapply(1:length(x), function(i) { 
res <- c(i, paste(ex_dollar(x)), unlist(stringr::str_extract_all(x[i], paste(toMatch, collapse = "|")))) 
if (length(res) > 1) {res 
} else NULL 
}) 
a <- plyr::ldply(a, rbind) 
a[] <- lapply(a, as.character) 
a[is.na(a)] <- "" 
names(a)[1] <- "row" 

私の出力は以下のようになります。ここでは何が起こっている

row 2 3 4 5   6   7 8  9 
1 1 $234 $270 NA NA Los Angeles Los Angeles LAX  SJD 
2 2 $234 $270 NA NA New York Mexico City   
3 3 $234 $270 NA NA   SOM   JUN HER    
4 4 $234 $270 NA NA Los Angeles Los Angeles LAX New York 

は運賃がすべての行から抽出され、それらはすべてが上の貼り付けされていることです各行

ここで問題は、ループ内にある貼り付け(ex_dollar(x))関数であると仮定しています。私は他の場所にその機能を残そうとしましたが、うまく動作しませんでした。ここで

row 2   3   4   5  6 
1 1 $234  Los Angeles Los Angeles LAX  SJD 
2 2 $270  New York Mexico City   
3 3 NA   SOM   JUN   HER    
4 4 NA   Los Angeles Los Angeles LAX New York 

答えて

2

:あなたは小数を持っている場合は、"\\$[0-9.]+"

の検索結果を使用します、その後、単純にループの内側ではなく、テキストの全体にラインごとにex_dollar()を使用します。つまり働いex_dollar(x[i])ではなくex_dollar(x)

a <- sapply(1:length(x), function(i) { 
res <- c(i, paste(ex_dollar(x[i])), unlist(stringr::str_extract_all(text[i], paste(toMatch, collapse = "|")))) 
if (length(res) > 1) {res 
    } else NULL 
}) 
+0

はい]を使用しています。ソリューションがシンプルだった昨日以来、これ以上私の頭を壊していた。私はRとプログラミング全体にはかなり新しいです。しかし、ありがとう@ dww :) –

1

はdata.frameという名前のDFのための一つの方法である:

は、私は私の出力は以下のようなものを見てみたい。これは、データフレームを返す

# extract dollars columns as a matrix 
myMat <- as.matrix(df[, 2:5]) 
# pull off diagonal (the data you want) 
myDollars <- diag(myMat) 

# construct new data.frame 
dfNew <- cbind(df[, -(2:5)], myDollars) 

# set names of columns and print result 
setNames(dfNew, c("row", 2:5, "myDollars")) 
    row   2   3 4  5 myDollars 
1 1 Los_Angeles Los_Angeles LAX  SJD  $234 
2 2 New_York Mexico_City <NA>  <NA>  $270 
3 3   SOM   JUN HER  <NA>  <NA> 
4 4 Los_Angeles Los_Angeles LAX New_York  <NA> 
2

コストを抽出する1つの方法は、正規表現を使用することです。

あなたのデータを使用して:

x <- data.frame(text = c("RT @airfarewatchdog: Los Angeles Los Angeles LAX to Cabo #SJD for $234", 
"RT @TheFlightDeal: Airfare Deal: [AA] New York - Mexico City, Mexico. $270", 
"SOME JUNK HERE", 
"RT @airfarewatchdog: Los Angeles Los Angeles LAX to New York")) 

方法は次のとおりです。

x$value = sapply(x,FUN = function(i){regmatches(i,gregexpr("\\$\\d+",i))}) 

この正規表現は、数字が続く$と一致します。あなたは既に(あなたがそのコードを提供していませんが、あなたのコードは、ex_dollar()を呼び出す)文字列からドルの値を抽出機能ex_dollar()を持っていると仮定すると

                 text value 
1  RT @airfarewatchdog: Los Angeles Los Angeles LAX to Cabo #SJD for $234 $234 
2 RT @TheFlightDeal: Airfare Deal: [AA] New York - Mexico City, Mexico. $270 $270 
3                SOME JUNK HERE  
4    RT @airfarewatchdog: Los Angeles Los Angeles LAX to New York 
関連する問題