2016-12-15 11 views
1

数字の数列を持つ「ゲーム」という値のデータフレームがあります。元のcsvファイルには値があり、読み込んだ時点ではNAsになりました。これらのNAsを(データフレームの列として保存されている)行中央値に置き換えようとしています。私はキャラクターから数字への強制的な元のNAを得ることができません。R - データフレーム内のNAsを数字に変更できません

まず、欠損値のインデックスを見つけました。

ng <- which(is.na(games), arr.ind = TRUE) 

次に、「linemedian」列の値でNAsを置き換えようとしました。

games[ng] <- games[ng[,1], "linemedian"] 
games[ng] 
[1] " -3.25" " 9.98" " -9.1" " -9.1" " 14.0" " -3.25" " 9.98" " -3.25" " 9.98" " 2.30" " 13.75" "-24.00" " 3.71" " 15.94" " 14.25" " -9.83" " 13.75" " -4.88" 

NAsを任意の数に置き換えることも機能しませんでした。

games[is.na(games)] <- 0 
[1] " 0.0" " 0.0" " 0" " 0" " 0" " 0.0" " 0.0" " 0.0" " 0.0" " 0.00" " 0.00" " 0.00" " 0" " 0" " 0.00" " 0.00" " 0.00" " 0.00" 

空白を削除すると結果が変わる可能性がありますが、それはできません。動作しませんでした

games[ng] <- as.numeric(trimws(games[ng[,1], "linemedian"])) 
[1] "-3.25" "9.98" "-9.1" "-9.1" "14" "-3.25" "9.98" "-3.25" "9.98" "2.3" "13.75" "-24" "3.71" "15.94" "14.25" "-9.83" "13.75" "-4.88" 

他の試みは:

games[ng] <- type.convert(games[ng]) # using type.convert() 

games[, -c(1,2)] <- as.numeric(games[, -c(1,2)]) # first two columns are metadata 
Error: (list) object cannot be coerced to type 'double' 

games[, -c(1,2)] <- as.numeric(unlist(games[, -c(1,2)]))  

games[ng] <- as.numeric(as.character(trimws(games[ng[,1], "linemedian"]))) 

# New Addition from Answer 
games[, sapply(games, is.numeric)][ng] <- games[, sapply(games, is.numeric)][ng[,1], "linemedian"] 

私は[NG]のゲームに割り当ててる値が数値であることを確実に知ります。 VALUE -

games[ng[,1], "linemedian"] 
[1] -3.25 9.98 -9.10 -9.10 14.00 -3.25 9.98 -3.25 9.98 2.30 13.75 -24.00 3.71 15.94 14.25 -9.83 13.75 -4.88 
typeof(games[ng[,1], "linemedian"]) 
[1] "double" 

はどこでも私はスタックオーバーフローボードに見て、明白な答えは、ゲーム[is.na(ゲーム)] <でなければなりません。しかし、それは動作していません。誰か何か考えがある?

は、ここでは、複製したい場合は、完全なコードです:

## Download Raw Files 

download.file("http://www.thepredictiontracker.com/ncaa2016.csv", 
      "data/ncaa2016.csv") 

download.file("http://www.thepredictiontracker.com/ncaapredictions.csv", 
      "data/ncaapredictions.csv") 

## Create Training and Prediction Data Sets 

games <- read.csv("data/ncaa2016.csv", header = TRUE, stringsAsFactors = FALSE, 
       colClasses=c(rep("character",2),rep("numeric",72))) 

preds <- read.csv("data/ncaapredictions.csv", header = TRUE, stringsAsFactors = TRUE) 
colnames(preds)[colnames(preds) == "linebillings"] <- "linebill" 
colnames(preds)[colnames(preds) == "linebillings2"] <- "linebill2" 
colnames(preds)[colnames(preds) == "home"] <- "Home" 
colnames(preds)[colnames(preds) == "road"] <- "Road" 

## Remove Columns with too many missing values 

rm <- unique(c(names(games[, sapply(games, function(z) sum(is.na(z))) > 50]), # Games and predictions 
      names(preds[, sapply(preds, function(z) sum(is.na(z))) > 10]))) # with missing data 

games <- games[, !(names(games) %in% rm)] # Remove games with no prediction data 

preds <- preds[, !(names(preds) %in% rm)] # Remove predictions with no game data 

## Replace NAs with Prediction Median 
ng <- which(is.na(games), arr.ind = TRUE) 
games[ng] <- games[ng[,1], "linemedian"] 

また、私は全体dput()出力を投稿することはできませんが、ここでは単に構造を表示するように設定データのビットです。

dput(head(games[1:6])) 

structure(list(Home = c("Alabama", "Arizona", "Arkansas", "Arkansas St.", 
"Auburn", "Boston College"), Road = c("USC", "BYU", "Louisiana Tech", 
"Toledo", "Clemson", "Georgia Tech"), line = c("12", "-2", "24.5", 
"4", "-8.5", "-3"), linesag = c(12.19, 0.97, 24.26, -2.07, -4.78, 
-2.74), linepayne = c(12, -0.81, 12.53, -0.86, -10.72, -3.87), 
linemassey = c(19.15, -2.1, 21.07, -8.68, -5.45, -6.76)), .Names = c("Home", 
"Road", "line", "linesag", "linepayne", "linemassey"), row.names = c(NA, 
6L), class = "data.frame") 

最後に、x86_64-w64-mingw32でRバージョン3.2.1を実行しています。

+2

適切な 'games'のサブセットに' dput'を呼び出した結果を投稿する必要があります。そうすれば、人々はデータ構造を知ることができます。 – alistaire

+0

私は、「ゲーム」の値が文字であることを意味するものとして、その出力を誤って解釈していたと思います。デバッグコードを投稿します。 –

答えて

1

テストケースがない場合、これはテストされません。あなたが世界の交換を取得しているが、あなたの列の一部が文字であるため、あなたは私だけの数値列にプロセスを制限しようとしている可能性が0から強要され、すべての文字値に強制を取得表示されます。

games[ , sapply(games, is.numeric) ][ ng ] <- 
         games[ , sapply(games, is.numeric)][ng[,1], "linemedian"] 

あなたを変更した後私はあなたの元のコードは成功したが、あなたのチェックの出力は問題領域であると結論づけました、ほぼ再現性のコード>

str(games[ , sapply(games, is.numeric)][ng[,1], "linemedian"]) 
#num [1:23] -3.25 9.98 -9.1 -9.1 14 -3.25 9.98 -3.25 9.98 2.3 ... 

games[ ng ] <- 
         games[ , sapply(games, is.numeric)][ng[,1], "linemedian"] 
games[ ng[1:2,] ] 
[1] " -3.25" " 9.98" 

> ng[1:2,] 
    row col 
[1,] 619 3 
[2,] 678 3 

> str(games) 
'data.frame': 720 obs. of 58 variables: 
$ Home   : chr "Alabama" "Arizona" "Arkansas" "Arkansas St." ... 
$ Road   : chr "USC" "BYU" "Louisiana Tech" "Toledo" ... 
$ line   : num 12 -2 24.5 4 -8.5 -3 8.5 37 -10.5 5 ... 
$ linesag  : num 12.19 0.97 24.26 -2.07 -4.78 ... 
$ linepayne : num 12 -0.81 12.53 -0.86 -10.72 ... 
deleted 

> games[ c(619,678) , 3] 
#[1] -3.25 9.98 
> games[ matrix(c(619,678,3,3), ncol=2)] 
[1] " -3.25" " 9.98" 

ので、3番目の列が割り当てた後、数値残ったが、理由のために、私は理解していません行列索引抽出の印刷機能の出力は、それがファーにあったときの文字のように見えましたct数値。

+0

私はこれを試しましたが、うまくいきませんでした。私の最初の試みは、数字の列だけでas.numericを呼び出すことでした(最初の2つを除くすべて)。とにかく、私は動作しなかった試行のリストに追加しました。 –

+0

合意。私が推測したコードは...うまくいかなかった。しかし、我々は両方とも 'games [ng]'の出力を誤解していました。だから私はあなたのコードが実際に働いていたと思いますし、コードも単純化しました: 'games [、] ' –

+0

これを確認して、あなたが正しいです。 NAsに値を割り当てる前に、 'colSums(games [、c(3、26)]、na.rm = TRUE')で列合計を取った。代入後、私は別の列合計をとり、値が変更されました。計算がチェックアウトされたことを確認するのは非常に簡単でした。助けてくれてありがとう。 –

関連する問題