2017-08-25 4 views
-2

他の条件が満たされていないときにforループを取得して文字列 'NA'を割り当てることはできません。R:iが真の場合、文字列を行列に代入する

これは私が試したものです...

Height <- c(1.6,3.4,0.42,n/a, 0.5,n/a,1.5,0,n/a,22.0) 
Height <- matrix(Height) 

h_cat <- matrix(, nrow = length(Height), ncol = 1) 
for (i in 1:length(Height)){ 
    if (Height[i]==0) 
    h_cat[i] <- 'NA' 
    if (Height[i]>0 & Height[i]<2) 
    print(Height[i]) 
    h_cat[i] <- '0-2 m' 
    #print(h_cat[i]) 
    if (Height[i]>=2 & Height[i]<5) 
    h_cat[i] <- '2-5 m' 
    if (Height[i]>=5 & Height[i]<10) 
    h_cat[i] <- '5-10 m' 
    if (Height[i]>=10) 
    h_cat[i] <- '>10 m' 
    else 
    h_cat[i] <- 'NA' 
} 

私はどちらかis.na()が、運に行きませんでした。

更新

申し訳ありませんでした。データが追加されました。

+3

いくつかのデータを共有してください... https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – snoram

+0

あなたは 'cut'関数を調べるべきです – Dason

+0

' h_cat 'は'行列 'であり、行番号と列番号を持つ。それは 'h_cat [i、1]'として索引付けされるべきです。 –

答えて

2

現在のコードには2つの大きな問題があります。

  1. まず、NA == 0があります。これはNAを返します。したがって、非NAエントリのif関数はwhich(!is.na(Height))のみ使用できます。
  2. あなたのif-else構成のロジックが意図しているように機能していません。

私は信じているの下にザ・あなたの意図を実現:

# Data needs to be numeric to check with ">" 
Height[Height == "n/a", ] <- NA 
Height <- as.numeric(Height) 

h_cat <- matrix(, nrow = length(Height), ncol = 1) 

# Can't have NA in logical tests 
non_na_entries <- which(!is.na(Height)) 
for (i in non_na_entries) { 
    if (Height[i] == 0) { 
    h_cat[i] <- NA 
    } else if (Height[i] > 0 & Height[i] < 2) { 
    h_cat[i] <- '0-2 m' 
    } else if (Height[i] >= 2 & Height[i] < 5) { 
    h_cat[i] <- '2-5 m' 
    } else if (Height[i] >= 5 & Height[i] < 10) { 
    h_cat[i] <- '5-10 m' 
    } else if (Height[i] >= 10) { 
    h_cat[i] <- '>10 m' 
    } else 
    h_cat[i] <- NA 
} 

    h_cat 

    [,1] 
[1,] "0-2 m" 
[2,] "2-5 m" 
[3,] "0-2 m" 
[4,] NA  
[5,] "0-2 m" 
[6,] NA  
[7,] "0-2 m" 
[8,] NA  
[9,] NA  
[10,] ">10 m" 
0

あなたのコードにはいくつかの問題があります。それらのうちの2つは、スノーラムによって対処されました。 にはNAを代入する必要があり、Heightmatrixである必要はありません。完全な答えに続くコードを作成するには、NA部分を繰り返します。多くの人が言っているよう

Height <- c(1.6,3.4,0.42,n/a, 0.5,n/a,1.5,0,n/a,22.0) 
Height[Height == "n/a"] <- NA 

は今、複雑なif/elseに代わるものは、cutです。クラスfactorのオブジェクトを返すので、戻り値をコード化する必要があります。これを行うには、パッケージdplyrの関数を使用します。

library(dplyr) 

h_cat <- cut(Height, c(0, 2, 5, 10, Inf)) 
h_cat[Height == 0] <- NA 
h_cat <- recode_factor(h_cat, 
       '(0,2]' = '0-2 m', 
       '(2,5]' = '2-5 m', 
       '(5,10]' = '5-10 m', 
       '(10,Inf]' = '>10 m') 
h_cat <- matrix(as.character(h_cat), ncol = 1) 
h_cat 

私はこれがはるかに簡単で読みやすいと信じています。 Neater。将来このコードに戻らなければならない場合は、おそらくそれを維持する方がはるかに簡単です。

関連する問題