2016-05-31 17 views
-1

我需要在出現單詞「exception」之前提取文本(4個字符)每行在我的數據框的一列中。例如,看到我的兩行數據如下:需要在出現在df中的列中出現的單詞之前提取4個空格的文本,並且可能每行出現多次

  1. MPSA:Original Version(01/16/2015); FMV例外:原始版本(04/11/2014); MM例外:08.19.15(08/19/2015)
  2. MPSA:Original Version(02/10/2015); FMV例外:原始版本(12/18/2014); MEI FMV:V3(12/18/2014); MEI FMV:更新(11/18/2014);會議材料例外:原始版本(04/21/2014);

正如您所看到的,「異常」每行發生一次以上,有時會大寫,有時不會,之前有不同的文本。我需要提取以前各種情況下的「FMV」,「MM」和「ial」。我們的目標是提取一個版本以下的(逗號分隔將被罰款,但沒有必要):

  1. 「FMVMM」
  2. 「FMVial」

我打算讓所有的文字小寫簡單,但我找不到正則表達式來提取我需要的4個字符的文本。任何建議?

回答

0

你基本上需要strsplitsubstrnchar

t1 <- "1.MPSA: Original Version (01/16/2015); FMV Exception: Original Version (04/11/2014); MM Exception: 08.19.15 (08/19/2015)" 

t2 <- "2.MPSA: Original Version (02/10/2015); FMV Exception: Original Version (12/18/2014); MEI FMV: V3 (12/18/2014); MEI FMV: updated (11/18/2014); Meeting Material exception: Original Version (04/21/2014); " 

f <- function(x){ 
    tmp <- strsplit(x, "[Ee]xception")[[1]] 
    ret <- array(dim = length(tmp) - 1) 
    for(i in 1:length(ret)){ 
    ret[i] <- substr(tmp[i], start = nchar(tmp[i]) - 3, stop = nchar(tmp[i])) 
    } 
    return(paste(ret, collapse = ",")) 
} 
f(t1) #gives "FMV , MM " 
f(t2) #gives "FMV ,ial " 

避免循環會更好,但現在,這應該工作。


編輯由Qaswed:改進了功能(短,不需要任何tolower更多)。


編輯由TigeronFire:

@Qaswed,謝謝您的指導 - 答案,但是,帶來了另一個問題。 t1和t2只有10000行數據幀上的兩行。我試圖將列邏輯添加到您建幾個不同的方式的功能,但我總是收到錯誤消息:

"Error in strsplit(BOSSMWF_practice$Documents, "[Ee]xception") : non-character argument" 

我試圖參照數據幀列BOSSMWF_practice $文件如下:

f <- function(x){ 
    tmp <- strsplit(BOSSMWF_practice$Documents, "[Ee]xception")[[1]] 
    ret <- array(dim = length(tmp) - 1) 
    for(i in 1:length(ret)){ 
    ret[i] <- substr(tmp[i], start = nchar(tmp[i]) - 3, stop = nchar(tmp[i])) 
    } 
    return(paste(ret, collapse = ",")) 
} 

f <- function(x){ 
    BOSSMWF_practice$tmp <- strsplit(BOSSMWF_practice$Documents, "[Ee]xception")[[1]] 
    BOSSMWF_practice$ret <- array(dim = length(BOSSMWF_practice$tmp) - 1) 
    for(i in 1:length(BOSSMWF_practice$ret)){ 
     BOSSMWF_practice$ret[i] <- substr(BOSSMWF_practice$tmp[i], start = nchar(BOSSMWF_practice$tmp[i]) - 3, stop = nchar(BOSSMWF_practice$tmp[i])) 
    } 
    return(paste(ret, collapse = ",")) 
} 

我試圖在我的應用列運行功能同時使用函數s設置爲默認設置

BOSSMWF_practice$Funct <- f(BOSSMWF_practice$Documents)

但我一直收到上述錯誤信息。你可以把你的意見一步,說明如何在這種新列應用到數據幀,並把結果?


編輯由Qaswed: @TigeronFire你應該已經添加到我的答案或編輯您的問題發表評論,但不能編輯我的問題。對你的評論:

#if your dataset looks something like this: 
df <- data.frame(variable_name = c(t1, t2)) 

#...use 
apply(df, 1, FUN = f) 
#note: there was an error in f. You need strsplit(x, ...) and not strsplit(t1, ...). 
+0

道歉 - 我試圖留下評論之前,而不是編輯,但評論框保持關閉,每當我點擊[返回]按鈕;它仍然如此。 – TigeronFire

+0

我試過了你的解決方案,但它最終給了我一個我調查過的錯誤,並且找不到修復程序。這裏是我插入的內容: BOSSMWF_practice $ Func < - apply(BOSSMWF_practice,27,FUN = f) 我假設你的應用示例中的[1]表示第一列,我需要調查的列是27th: 錯誤在if(d2 == 0L){:缺少值,其中TRUE/FALSE需要 我認爲這意味着在使用該函數時會有空值,因此會打斷它,所以我試圖用na來解決。 rm = TRUE沒有成功。再次問道歉,但任何建議? – TigeronFire

+0

否。應用中的'1'表示:「該函數將應用於您的對象的每個*行*(這裏是'df')」。如果它是'2',則意味着將其應用於每個*列*(請參閱手冊,在R控制檯中鍵入R命令'apply')。如果你想把它應用到第27列的每一行,使用'apply(BOSSMWF_practice [,27],1,FUN = f)'。 – Qaswed

相關問題