0

私の友人と話した後、単純なテスト操作を実行するための私のソリューションが、R でプログラミングする方法に関して非常に優れているかどうかはもうわかりません。私は r にまったく慣れていないので、多くのコードを作成する代わりに、正しく学習する方法。

私の目的は、異なる範囲に基づいて列の値をグループ化することだけでした。だから私がしたことは次のとおりでした:

    #create a test df
    a<-factor(c("a","b","c","d","e","f","g"))
    b<-c(1,2,NA,4,5,6,7)
    c<-factor(c("a","a","a","d","e","f","a"))
    d<-c(1,7,1,7,2,5,4)
    df.abcd<-data.frame(a,b,c,d)
    df.abcd

    # apply groups in new column based on values in d 
    # groups are 0-2, 3-5, 6-7
    df.abcd$groups<-
      ifelse(df.abcd$d>-1&df.abcd$d<=2,"0-2",
             ifelse(df.abcd$d>2&df.abcd$d<=5,"3-5",
                    ifelse(df.abcd$d>5&df.abcd$d<=7,"6-7","outside the defined Ranges" 
                    )

             )
      )

したがって、このソリューションは私にとってはうまく機能しますが、多くのコードと多くのifelseのものです。多分もっとエレガントな解決策があるはずです。

私の友人は、R はデータフレームで多くの作業を行うようには設計されておらず (私の場合は新しい列を適用する)、新しいオブジェクトを直接操作するように設計されていると私に言いました。そこで彼は、グループを Group1<- などのオブジェクトとして作成するようなことを提案しました。私は独学で R を学び、正しい方法 (実行による学習) を教えてくれる教授がいないので、反対の作業を避けたくありません。言語のロジック(そのようなものがあれば)。

ヘルプと説明をいただければ幸いです。一番

4

1 に答える 1

4

これに使用cut()して、因子レベルを調整できます。

df.abcd$groups <- cut(df.abcd$d, c(0,2,5,7))
levels(df.abcd$groups) <- c("0-2", "3-5", "6-7", "Outside the defined range")
df.abcd$groups[is.na(df.abcd$groups)] <- max(levels(df.abcd$groups))

または、たとえば、連続した範囲を分割したくない場合は、インデックス ベクトルを使用できます。

df.abcd$groups[df.abcd$d>-1 & df.abcd$d<=2] <- "0-2"
df.abcd$groups[df.abcd$d>2 & df.abcd$d<=5] <- "3-5"
df.abcd$groups[df.abcd$d>5 & df.abcd$d<=7] <- "6-7"
df.abcd$groups[is.na(df.abcd$groups)] <- "Outside the defined range"
df.abcd$groups <- as.factor(df.abcd$groups)

一般に、多数の ifelse をループしたりスタックしたりすることはお勧めできません。可能であれば、インデックス ベクトルと組み込みの R 関数を使用します。

于 2013-01-08T09:31:56.163 に答える