你基本上需要strsplit
,substr
和nchar
:
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, ...).
道歉 - 我試圖留下評論之前,而不是編輯,但評論框保持關閉,每當我點擊[返回]按鈕;它仍然如此。 – TigeronFire
我試過了你的解決方案,但它最終給了我一個我調查過的錯誤,並且找不到修復程序。這裏是我插入的內容: BOSSMWF_practice $ Func < - apply(BOSSMWF_practice,27,FUN = f) 我假設你的應用示例中的[1]表示第一列,我需要調查的列是27th: 錯誤在if(d2 == 0L){:缺少值,其中TRUE/FALSE需要 我認爲這意味着在使用該函數時會有空值,因此會打斷它,所以我試圖用na來解決。 rm = TRUE沒有成功。再次問道歉,但任何建議? – TigeronFire
否。應用中的'1'表示:「該函數將應用於您的對象的每個*行*(這裏是'df')」。如果它是'2',則意味着將其應用於每個*列*(請參閱手冊,在R控制檯中鍵入R命令'apply')。如果你想把它應用到第27列的每一行,使用'apply(BOSSMWF_practice [,27],1,FUN = f)'。 – Qaswed