0

私を n00b と考えてください。ここで特定のクエリを検索しましたが、まだ答えが見つかりません。私の問題は次のとおりです。私のデータセットを表す次の簡略化された csv ファイル r_split.csv を検討してください。

id,v1,v2,v3,v4,str
1,2.4,2.4,345.5,234.2,gbbc
2,4.5,2.56,7.45,34.6,ebird
3,3.4,5.6,4.45,6.3,ebird_can

最初の行には、ヘッダー名が含まれています。列 str には 3 つの異なる文字列値が含まれていることがわかりますgbbc, ebird, ebird_can。私の目的は、この大きなデータセットを 2 つのデータセットに分割することです。最初のものにはすべての str 値 = のみが含まれgbbc、2 番目のものには のすべての str 値が含まれ、名前がebirdebird_can変更されallebirdます。

次のコマンドを使用して、データセットを 3 つの異なるデータセットに分割できます。

splitted<-split(rsplit,rsplit$str)

ただし、 str 列の2つの異なる値を使用して3番目に結合する方法がわかりません。誰か助けてくれませんか?

ありがとう。

4

2 に答える 2

2

まず、str列が ではないことを確認してfactorください。すべての文字列を因子としてではなく文字としてロードするには、stringsAsFactors = FALSE内のオプションを使用します。read.csv(.)

subset第二に、インタラクティブなセッション中に使用しても問題ありません。ただし、この投稿(またはhadley の wiki への直接リンク) がうまく説明しているように、関数内で使用することは賢明ではありません。

で直接サブセット化することをお勧めし[ます。

df1 <- df[df$str == "gbbc", ]
df2 <- df[df$str != "gbbc", ]
df2$str <- "allebird"
> df1
#   id  v1  v2    v3    v4  str
# 1  1 2.4 2.4 345.5 234.2 gbbc
> df2
#   id  v1   v2   v3   v4      str
# 2  2 4.5 2.56 7.45 34.6 allebird
# 3  3 3.4 5.60 4.45  6.3 allebird

または、「gbbc」と「allebird」の 2 つの値しかない場合は、最初に「gbbc」以外のすべてを「allebird」に置き換えてから、前述のように分割を使用できます。

df3 <- df
df3$str[df3$str != "gbbc"] <- "allebird"
split(df3, df3$str)
# $allebird
#   id  v1   v2   v3   v4      str
# 2  2 4.5 2.56 7.45 34.6 allebird
# 3  3 3.4 5.60 4.45  6.3 allebird
# 
# $gbbc
#   id  v1  v2    v3    v4  str
# 1  1 2.4 2.4 345.5 234.2 gbbc
于 2013-03-18T20:28:46.543 に答える
2

この関数を使用してlevels、因子のレベルを変更およびマージできます。あなたの場合( str がすでにレベルのデフォルトの順序付けの要因であると仮定すると)、次のようなことができます:

levels(rsplit$str) <- c('allebird','allebird','gbbc')
splitted<-split(rsplit,rsplit$str)

最初に rsplit のコピーを作成し、元のレベルではなくコピーを変更することをお勧めします (元のレベルで元のレベルを維持したい場合)。

より複雑な例としてgrep、 、gsub、または gsubfn パッケージなどのツールを使用して、因子レベルの新しいベクトルを作成できます。

于 2013-03-18T20:50:49.197 に答える