这是问题
我有一个csv文件,我read.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);
}
问题是,当我这样做时,它说列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
答案 0 :(得分:3)
将来,请在您要呈现给我们的任何对象上使用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")])