2

Rにdata.frameがあります。ループサブセット関数を使用して3つの異なるdata.frameを作成したいと思います。大きなdata.frameがありますが、必要なのは以下の例です。

sex<-c("M","M","M","F","M","F")
age<-c(20,18,17,20,18,17)
name<-c("John", "Joseph", "Bill", "Sarah", "Robert", "Dana")
data<-data.frame(sex, age, name)

>data
        sex  age   name
    1   M    20    John
    2   M    18    Joseph
    3   M    17    Bill
    4   F    20    Sarah
    5   M    18    Robert
    6   F    17    Dana

私が欲しいのは:

>age17
      sex   age   name
    1 M     17    Bill
    2 F     17    Dana

>age18
      sex   age   name
    1 M     18    Joseph
    2 M     18    Robert


>age20
      sex   age   name
    1 M     20    John
    2 F     20    Sarah

以下のコマンドを使用できます。

>age17<-subset(data, data[,2]==17)
>age18<-subset(data, data[,2]==18)
>age20<-subset(data, data[,2]==20)

しかし、ループを使用してコマンドのサイズを減らすことは可能ですか?

4

1 に答える 1

6

使用split

x <- split(data, data$age)

x
$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana

$`18`
  sex age   name
2   M  18 Joseph
5   M  18 Robert

$`20`
  sex age  name
1   M  20  John
4   F  20 Sarah

$これでデータフレームのリストが作成され、任意の抽出演算子、つまり、、[またはを使用してリストの要素にアクセスできます[[

たとえば、最初の要素は次のとおりです。

x[1]
$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana

または名前の要素17。ただし、数字で始まる名前は標準ではないため、これらの名前を参照するにはバッククォートを使用する必要があることに注意してください。

x$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana
于 2012-07-13T15:38:47.237 に答える