データ内の欠落している値または文字値を行平均に置き換えたい。たとえば、以下のデータでは、欠落している値は「U」で示され、p1からp6までのすべての「U」を各行の「ave」列の値に置き換えたいと思います。置き換える行は数千あります。
num p1 p2 p3 p4 p5 p6 ave
L1 0 10 1 U 0 -10 1.3
L2 10 1 10 10 U 10 7.1
L3 U 10 10 U 1 -10 3.1
データ:
df<-read.table(text="num p1 p2 p3 p4 p5 p6 ave
L1 0 10 1 U 0 -10 1.3
L2 10 1 10 10 U 10 7.1
L3 U 10 10 U 1 -10 3.1 ", header = TRUE)
apply
sを置き換えるために使用できますU
:
as.data.frame(t(apply(df, 1, function(x) replace(x, x == "U", tail(x, 1)))))
num p1 p2 p3 p4 p5 p6 ave
1 L1 0 10 1 1.3 0 -10 1.3
2 L2 10 1 10 10 7.1 10 7.1
3 L3 3.1 10 10 3.1 1 -10 3.1
forループは一般的にr言語では推奨されていないため、svenの答えの方が優れていますが、これがあなたがやろうとしていることを実行する簡単な方法です。
# example data table
mtcars
# here's how to access all the columns below two in the first row
mtcars[ 1 , mtcars[ 1 , ] < 2 ]
# here's how to take the mean of all columns at or above two in the first row
rowMeans( mtcars[ 1 , mtcars[ 1 , ] >= 2 ] , na.rm = T )
# here's how to overwrite the values below two with the mean of all columns at or above two
mtcars[ 1 , mtcars[ 1 , ] < 2 ] <- rowMeans( mtcars[ 1 , mtcars[ 1 , ] >= 2 ] , na.rm = T )
# run this command for every row, and you're done
for ( i in seq( nrow( mtcars ) ) ){
mtcars[ i , mtcars[ i , ] < 2 ] <-
rowMeans( mtcars[ i , mtcars[ i , ] >= 2 ] , na.rm = T )
}
これが1つのアプローチです:
mydf <- read.table(
header = TRUE, stringsAsFactors = FALSE,
text = "num p1 p2 p3 p4 p5 p6 ave
L1 0 10 1 U 0 -10 1.3
L2 10 1 10 10 U 10 7.1
L3 U 10 10 U 1 -10 3.1")
cbind(mydf[1],
t(apply(mydf[-1], 1,
function(x) ifelse(x == "U", x["ave"], x))))
# num p1 p2 p3 p4 p5 p6 ave
# 1 L1 0 10 1 1.3 0 -10 1.3
# 2 L2 10 1 10 10 7.1 10 7.1
# 3 L3 3.1 10 10 3.1 1 -10 3.1