2016-07-20 4 views
0

に文字を変換することによって検閲値を排除するためにdata.frameの列を操作するには、私が働いているデータのミニバージョンです:R - ここで数字

columnNum <- c("G1", "G2", "G3") 
Al <- c("<5", 6, 7, "<4", 5, 6) 
Ca <- c(9, 10, 11,10, 11, 12) 
df <- data.frame(columnNum, Al, Ca, stringsAsFactors = FALSE) 

は、現在、各列のクラスは、文字です(<を含む)一部の値が打ち切られているため、数字、数字、(左から右へ)

私がしようとしているのは、 "Al"列の値を実際の数値文字列の代わりに。私はただ1つの列でそれを行う方法を見つけることができると確信していますが、私の問題は、実際には、私は2つの異なる列を持っていることです。私は各列( "Al"から "Zn ")、値が検閲されているかどうかを確認し、もしそうなら、" < "を取り除いて数字に変換する。

私はまだかなり新しいですので、これは私が(私のビッグデータ上にないこの小さな1)を実行しようとしましたものです:

for(i in df$Al:df$Zn) 
{ 
    if (class(df[[i]]) != numeric) 
    { 
     df[[i]] <- as.numeric(gsub(pattern = "<", replacement =  
     "", df[[i]])) 
    } 
} 

ループ終了するだけでした。

+0

'$アルDF:$ Zn'ではありませんdfを'df $ Al'の最初の要素から' df $ Zn'の最初の要素までのシーケンスです(数値の場合)。 – alistaire

+0

おかげで、ありがとう!私はちょうど暗闇の中で何が起こるか見るために一発を撮った。 – BBODS

答えて

1

調整する列を最初に見つけます。私たちはからZnまでの列としてあなたの説明に従ってこれを行います。次にsub不要な文字を入力し、numerize機能を使用してnumericに変換します。私は複雑さを示すために、複数の列を追加しました:

cols <- match("Al", names(df)):match("Zn", names(df)) 
numerize <- function(x) as.numeric(sub(".*?([0-9.-]+).*", "\\1", x)) 

#base R 
df[cols] <- lapply(df[cols], numerize) 

#dplyr 
df %>% mutate_at(vars(Al:Zn), numerize) 

#data.table 
setDT(df)[, (names(df)[cols]) := lapply(.SD, numerize), .SDcols=cols][] 

# columnNum Al Yw Zn Ca 
# 1  G1 5 8 1 9 
# 2  G2 6 6 6 10 
# 3  G3 7 7 7 11 
# 4  G1 4 4 4 10 
# 5  G2 5 5 5 11 
# 6  G3 6 6 6 12 

データ

columnNum <- c("G1", "G2", "G3") 
Al <- c("<5", 6, 7, "<4", 5, 6) 
Yw <- c("<8", 6, 7, "<4", 5, 6) 
Zn <- c("<1", 6, 7, "<4", 5, 6) 
Ca <- c(9, 10, 11,10, 11, 12) 
df <- data.frame(columnNum, Al, Yw, Zn, Ca, stringsAsFactors = FALSE) 
0

tidyr::extract_numericdplyr中かどうかにかかわらず、便利です:

df$Al <- tidyr::extract_numeric(Al) # or df %>% mutate(Al = extract_numeric(Al)) 

とほぼ同等です
df$Al <- as.numeric(sub('.*(-?[0-9]+.?[0-9]*).*', '\\1', df$Al)) 
0この特定のケースのために単純化することができ

:関係なく、あなたが使用しているの

df$Al <- as.integer(sub('<', '', df$Al)) 

は、このデータのためにあなたが得る:

## columnNum Al Ca 
## 1  G1 5 9 
## 2  G2 6 10 
## 3  G3 7 11 
## 4  G1 4 10 
## 5  G2 5 11 
## 6  G3 6 12