2015-05-07 46 views
0

我有具有與大多數值兩列的數據幀以選擇一個以上的列,但也被記錄爲><例如>10000如何使用正則表達式

一些值I需要過濾數據,以便它可以被評估,當這些值只在一列中時,以下工作正常。

x_clean = x[!grepl('[^0-9]', x[[2]]),] 

我首先想到所有這些事件會涉及兩列,只需要使用col2,但已經發現,有時我得到col2數值,但在col3

一個</>使用下面給我留下具有完全空白的數據框。

x_clean = x[!grepl('[^0-9]', x[2:3]),] 

我想這是因爲[[]]山坳轉換成一個列表,然後grepl不滿意。

如果有人能提供一些幫助,我將不勝感激。目前我第二次用3代替2重複評估。這工作正常,但似乎很笨拙。

任何幫助,將不勝感激。 問候

+0

你能發佈dput的'的輸出(頭(X,10))'' –

+1

X [2:3]'是data.frame,同時'X [[2]]'是一個向量,而不是一個列表,fyi。目前還不清楚你想通過'!grepl'一次執行兩個列。這是「不是這些」還是「不是這兩個」? – Frank

+0

謝謝弗蘭克。我需要刪除第2列和第3列中的非數字值。 –

回答

0

你想

grepl('[^0-9]', x[[2]]) & grepl('[^0-9]', x[[3]]) 

因爲grep的只返回從data.frame每個字段的第一個值的正則表達式 的計算結果爲,請參閱:

x = data.frame(a = c(1,2,'>3'),b=c(1,'<2',3),c = c(1,'<2','>3')) 
x 
#> a b c 
#> 1 1 1 1 
#> 2 2 <2 <2 
#> 3 >3 3 >3 

grepl('[^0-9]', x[2:3]) 
#> [1] TRUE TRUE 

,或者你想不得不編寫不同的代碼,當你想在行上使用grepl時 條件,你可以這樣做:

temp <- lapply(x, function(x)grepl('[^0-9]',x)) 

temp 
#> $a 
#> [1] FALSE FALSE TRUE 
#> 
#> $b 
#> [1] FALSE TRUE FALSE 
#> 
#> $c 
#> [1] FALSE TRUE TRUE 

# applies the or operator (|) across all the arguments 
OR <- function (...) 
{ 
    argList <- list(...) 
    names(argList) <- NULL 
    switch(as.character(length(argList)), 
      `0` = NULL, 
      `1` = argList[[1]], 
      `2` = argList[[1]] | argList[[2]], 
      do.call("OR", c(list(argList[[1]] | argList[[2]]), 
          argList[-(1:2)]))) 
} 

x_clean <- x[!do.call(OR,temp),] 
0

我認爲你可以轉換爲數字;任何無法轉換的條目將變爲NA,並且可以被濾除。此外,如果您正在進行任何後續分析,您將需要數字格式的數據。

x[] <- lapply(x,function(x)as.numeric(as.character(x))) 
na.omit(x) 

實施例:

x <- data.frame(x1=c(1,">1",2),x2=c(">1",2,3)) 
# x1 x2 
# 1 1 >1 
# 2 >1 2 
# 3 2 3 

x[] <- lapply(x,function(x)as.numeric(as.character(x))) 
na.omit(x) 
# x1 x2 
# 3 2 3