1

这是问题

我有一个我 read.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

现在我想把它分成两个数据框,一个带有数据grp1,另一个用于grp2

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); 
}

问题是,当我这样做时,它说column a doesn't exist,当我打印这些东西时,这就是我们看到的:

 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 回答