【问题标题】:Subsetting lists after split in R在 R 中拆分后的子集列表
【发布时间】:2012-07-24 11:32:00
【问题描述】:

问题来了

我有一个我 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); 
}

问题是,当我这样做时,它说 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

【问题讨论】:

    标签: r csv split dataframe


    【解决方案1】:

    以后,请在您要呈现给我们的任何对象上使用 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")])
    

    【讨论】:

    • 你可以一举搞定:split(raw[, c("a","b","c","d")], raw$grp) 不错的答案;非常彻底 +1
    • 因此,在我拆分后,我有一些列表 x,我将在对它们进行子集化后分配我的组。然后我将在循环结束后将名称移到上面。这是问题所在,我会将 x 的值传递给需要数据框的函数。当我使用 is.data.frame(x[i]) 时,我得到了错误,当我将 x[i] 强制转换为数据框时,我最终会遇到同样的列名错误的问题。我在这里误解了什么吗?所以我们解决了子集问题,但没有解决重命名问题
    • try is.data.frame(x[[i]]) 你遇到的问题是你不明白当你有一个列表时,x,子集x 和x[1] 将返回一个列表元素,(即 x 的第一个元素)。与 x[[1]] 相比,它只会返回 x 的第一个元素。作为一般经验法则,在使用列表时,您希望使用 ``[[ `` 来提取单个元素,而 ``[ `` 当您需要列表的多个元素时(仍在列表中)形式--即,x[1:3].
    • 它就像一个魅力!好吧,我想我真的需要看看[[]]。非常感谢!
    • +1 - 同样,不需要创建函数,你可以做lapply(groups, "[", c("a", "b", "c", "d"))
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 2017-04-02
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多