1

これが問題です

私は.csv()を読んでこれに出力するcsvファイルを持っています:

   grp  b a  id d c
1 grp1  2 1 id3 3 2
2 grp1 -2 1 id1 3 2
3 grp0 -2 1 id4 3 2
4 grp0  1 1 id0 3 2
5 grp0  1 1 id2 3 2

これを 2 つのデータフレームに分割します。1 つはデータを含み、もう 1 つgrp1grp2

groups <- split(raw, raw$grp);

これにより、次のようになります。

$grp0
   grp  b a  id d c
3 grp0 -2 1 id4 3 2
4 grp0  1 1 id0 3 2
5 grp0  1 1 id2 3 2

$grp1
   grp  b a  id d c
1 grp1  2 1 id3 3 2
2 grp1 -2 1 id1 3 2

ここa,b,c,dで、これらの各リストの行が必要なだけなので、使用するデータフレームにそれらを強制する必要がありますsubset()。つまり、次のことを行う必要があります。

for(i in 1:length(groups))
{
      x <- subset(as.data.frame(groups[i]), select = c(a,b,c,d));
      some_function(x); 
}

問題は、これを行うと、列 a が存在しないと表示され、この内容を印刷すると、次のようになることです。

 grp0.grp grp0.b grp0.a grp0.id grp0.d grp0.c
3     grp0     -2      1     id4      3      2
4     grp0      1      1     id0      3      2
5     grp0      1      1     id2      3      2
  grp1.grp grp1.b grp1.a grp1.id grp1.d grp1.c
1     grp1      2      1     id3      3      2
2     grp1     -2      1     id1      3      2

したがって、これらの列は単なる a、b、c、d ではなく、分割時に作成された名前が先頭に追加されます。これを回避する方法はありますか?または、データフレームの名前を取得して、サブセット化する要素のリストに追加する方法はありますか? 次のようなデータフレームになりたいだけです。列名は正確である必要はありません。

$grp0
       b  a  d c
    3 -2  1  3 2
    4  1  1  3 2
    5  1  1  3 2

$grp1
       b  a  d c
    1  2  1  3 2
    2 -2  1  3 2
4

1 に答える 1

4

将来的には、私たちに提示したいすべてのオブジェクトで dput() を使用してください。これにより、コードを記述するためにサンプルを手動で入力する必要がなくなります。

あなたはSASプログラマーですか?すべての行の後にセミコロンは必要ありません...

raw <- data.frame(
    grp=c("grp1","grp1","grp0","grp0","grp0"),
    b=c(2,-2,2,1,1),
    a=rep(1,5),
    id=c("id3","id1","id4","id0","id2"),
    d=rep(3,5),
    c=rep(2,5)
)
groups <- split(raw, raw$grp)

あなたは実際にはかなり近かった。と の違いをよく読むことをお勧めし?`[`ます?`[[`。修正されたコードは次のとおりです。

x <- list()
for(i in 1:length(groups)) {       
x[[i]] <- subset(as.data.frame(groups[[i]]), select = c(a,b,c,d));     
  } 
names(x) <- names(groups)
x

とはいえ、?lapply関数を学んでみてください

lapply(groups, function(.groups) .groups[,c("a","b","c","d")])
于 2012-07-25T22:55:54.907 に答える