1

データ内の欠落している値または文字値を行平均に置き換えたい。たとえば、以下のデータでは、欠落している値は「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  
4

3 に答える 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)

applysを置き換えるために使用できます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
于 2013-01-21T16:15:31.653 に答える
0

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 )
}
于 2013-01-21T16:18:07.683 に答える
0

これが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
于 2013-01-21T16:20:11.650 に答える