データ
d <- read.csv(file = 'https://stats.dip.jp/01_ds/data/data_cleansing2_dirty_data_exercise.csv')
library(DT)
datatable(d)
m <- as.matrix(d)
可視化する場合
boxplot(m)

any(m < 0)
## [1] TRUE
any(abs(m) > 3*sd(m))
## [1] TRUE
jj <- 25:35
boxplot(m[, jj])

j <- 27
y <- m[, j]
barplot(height = y,names.arg = 1:nrow(m))

ii <- 525:540
y <- m[ii, j]
barplot(height = y,
cex.names = 0.4,
names.arg = paste(ii, '\n(', y, ')'))

m[531, j]
## V27
## -0.92
jj <- 80:90
boxplot(m[, jj])

j <- 83
y <- m[, j]
barplot(height = y,names.arg = 1:nrow(m))

ii <- 670:685
y <- m[ii, j]
barplot(height = y,
cex.names = 0.4,
names.arg = paste(ii, '\n(', y, ')'))

m[675, j]
## V83
## -0.55
可視化しないで直接的に求める場合
# 負の値
m[m < 0]
## [1] -42.00 -0.92 -0.55 -0.03
sigma <- sd(m) # 標準偏差
# 3シグマ(標準偏差の3倍)を超える値
m[abs(m) > 3*sigma]
## [1] -42 22 111
# 4シグマ(標準偏差の4倍)を超える値
m[abs(m) > 4*sigma]
## [1] -42 22 111
# 行と列のインデックス(Row, Col)と値(Value)のデータを作成
m.a <- NULL # 結果格納用の空のオブジェクトを作成
for (j in 1:ncol(m))
{
for (i in 1:nrow(m))
{ # 負値または3シグマを超える異常値を検出しレコードを追加していく。
if ( m[i, j] < 0 | m[i, j] > 3 * sigma )
{
cat('Row:', i, ', Col:', j, ', Value: ', m[i, j], fill = T)
m.a <- rbind(m.a, t(c(i, j, m[i, j]))) # rbind:行ベクトルを追加
}
}
}
## Row: 2 , Col: 1 , Value: -42
## Row: 42 , Col: 1 , Value: 22
## Row: 99 , Col: 1 , Value: 111
## Row: 531 , Col: 27 , Value: -0.92
## Row: 675 , Col: 83 , Value: -0.55
## Row: 124 , Col: 85 , Value: -0.03
# 結果表示
colnames(m.a) <- c('Row', 'Col', 'Value')
m.a
## Row Col Value
## [1,] 2 1 -42.00
## [2,] 42 1 22.00
## [3,] 99 1 111.00
## [4,] 531 27 -0.92
## [5,] 675 83 -0.55
## [6,] 124 85 -0.03