2017-09-28 21 views
1

私は1つの列7 1/4 INCHES1/4 INC9/16 INCH1 3/4 INCHES1 13/16 INCHES20 INCHESなどの不足している細胞と文字列で構成されています。データテーブルを持っています私は空白とINC/INCH/INCHES(文字列分割)を取り除き、残りの文字列を数値に変換して7+1/4=7.25のようにしたいと考えています。評価文字列や空のセル

library(data.table) 
data<-data.table(variable = c("", "", "7 1/4 INCHES", "1/4 INC", "9/16 INCH", "1 3/4 INCHES", "", "1 13/16 INCHES", "20 INCHES", "", "")) 
#Assigning 0s to empty cells 
data$variable[data$variable == "" ] = 0 
#Getting rid of INCH, INCHES and INCH 
data$variable<-gsub("[[:space:]][A-z]*$", "", data$variable) 
#Adding "+" instead of whitespace (for summation), like 7+1/4 instead of 7 1/4 
data$variable<-gsub(" ", "+", data$variable) 
data$variable<-eval(parse(text=data$variable)) 

しかし、evalを機能させることはできません。あなたはそれについて私を助けてくれますか? 第2に、この特定のコードは非常に効率的な方法ではないようです。私は非常に大きなデータセットを持っていますが、上記の小さな例のように、多くの観測結果を持つ4つの列があります。どのように物事を少し締めることができますか?

EDIT:

data$variable<-sapply(data$variable, function(x) eval(parse(text=x))) 

私はそれが上記の行を使用して動作させます。しかし、それはまだ効率的な方法ではありません。

答えて

2

これを行う方法の1つは、文字列の各部分を別々の変数に抽出し、これらを使用して結果を計算することです。

library(tidyverse) 

data %>% 
    as_tibble() %>% 
    extract(variable, c("x"), "^(\\d+) ", remove = FALSE) %>% 
    extract(variable, c("y", "z"), "(\\d+)/(\\d+)", remove = FALSE) %>% 
    mutate_at(vars(x, y, z), as.numeric) %>% 
    mutate(result = if_else(is.na(x), 0, x) + if_else(is.na(y/z), 0, y/z)) %>% 
    select(variable, result) 
#> # A tibble: 11 x 2 
#>   variable result 
#>    <chr> <dbl> 
#> 1     0.0000 
#> 2     0.0000 
#> 3 7 1/4 INCHES 7.2500 
#> 4  1/4 INC 0.2500 
#> 5  9/16 INCH 0.5625 
#> 6 1 3/4 INCHES 1.7500 
#> 7     0.0000 
#> 8 1 13/16 INCHES 1.8125 
#> 9  20 INCHES 20.0000 
#> 10     0.0000 
#> 11     0.0000 

これanswer

+0

はどうもありがとうございましたこの種の問題にアプローチする方法をいくつか示しています!私はちょうど基本パッケージを使用することに焦点を合わせているので、私は見直しをしなかった。 1つの簡単な質問:この結果の列を保存する方法は?私はそれが騒ぎだと思う。私はその種のクラスではあまりよく経験していません。 –

+1

@MustafaMuratARAT、 'data%>%'行を 'new_df <- data %>%'に変更し、結果を 'new_df'に保存します。標準のデータフレームに変換するには、 'new_df < - as.data.frame(new_df)'を実行します。 – markdly

関連する問題