【问题标题】:Split dataframe based on value in column - loop over list of id's [duplicate]根据列中的值拆分数据框 - 遍历 id 列表 [重复]
【发布时间】:2018-06-22 09:44:09
【问题描述】:

我正在尝试根据 id 列中的值拆分数据框。

我有什么:

ids<-as.data.frame(c("a","a","a","b","b","b","c","c","c"))
unique_id<-unique(ids)
values<-as.data.frame(rep(1:3,3))
df<-as.data.frame(cbind(ids,values))
colnames(df)<-c("id","values")

它看起来像:

> df
  id values
  a      1
  a      2
  a      3
  b      1
  b      2
  b      3
  c      1
  c      2
  c      3

我得到的代码和错误是:

> for(id in unique_id){
+     paste0("value_for_",id)<-split(df, id = df$id)
+ }
Error in deparse(...) : 
  unused argument (id = c(1, 1, 1, 2, 2, 2, 3, 3, 3))

我想要什么:

 value_for_a
  id value
  a     1
  a     2
  a     3

 value_for_b
  id value
  b     1
  b     2
  b     3

 value_for_c
  id value
  c     1
  c     2
  c     3

我觉得这应该是相当简单的,但我刚刚没有想法。我不反对使用比for loop 更复杂的方法。

【问题讨论】:

  • 使用split; split(df, df$id)
  • 这与代码中的内容有什么不同吗?
  • 在不尝试分配给paste 的情况下使用它,而不是在循环内(它已经矢量化)。 group_list = split(df, df$id) 就是您所需要的。列表的名称已经基于id 列。
  • 不应该希望这些作为单独的数据帧,list 的数据帧更容易使用。您可以使用 for 循环或 lapply 进一步并行处理它们,或者仍然一次处理一个。有关更多讨论和提示,请参阅 How do I make a list of data frames?
  • 如果你真的想这样做,看看list2env

标签: r


【解决方案1】:

我建议使用split() 函数拆分数据帧(R 中的函数可以完全按照您的要求进行操作)。

例如:

# Using OPs data
split(df, df$id)

在这里,您要求将 df 按列 id 拆分。此函数的输出是 df 的列表。

$a
  id values
1  a      1
2  a      2
3  a      3

$b
  id values
4  b      1
5  b      2
6  b      3

$c
  id values
7  c      1
8  c      2
9  c      3

你可以使用这个命令获得想要的名字:

myList <- split(df, df$id)
names(myList) <- paste0("value_for_", names(myList))

【讨论】:

    【解决方案2】:

    您可以为此使用nest()

    library(tidyr)
    df%>%
    group_by(id)%>%
    nest()
    
    # A tibble: 3 x 2
      id     data            
      <fctr> <list>          
    1 a      <tibble [3 x 1]>
    2 b      <tibble [3 x 1]>
    3 c      <tibble [3 x 1]>
    

    每个小标题都包含您感兴趣的值。

    df%>%
    group_by(id)%>%
    nest()%>%
    .$data
    
    
    [[1]]
    # A tibble: 3 x 1
      values
       <int>
    1      1
    2      2
    3      3
    
    [[2]]
    # A tibble: 3 x 1
      values
       <int>
    1      1
    2      2
    3      3
    
    [[3]]
    # A tibble: 3 x 1
      values
       <int>
    1      1
    2      2
    3      3
    

    【讨论】:

    • 这很漂亮。稍后我将如何调用这些数据帧?我需要对它们进行其他处理并将它们与其他数据框结合起来。
    • 嗯,您可以使用id 列作为参考,这样您就可以使用id 对应的data 来引用您感兴趣的data.frames你感兴趣。
    • "为什么不使用nest()?" 因为split 做同样的事情,并且内置于基础R,所以它不需要任何外部依赖? split(df, df$id).
    • 啊,那么让我重新措辞一下。我不是故意的。
    • 我确实明白你的问题是反问,但我认为这是一个很好的问题:为什么使用library(tidyr); library(dplyr); df%&gt;% group_by(id)%&gt;% nest()?,当@ 987654330@ 做同样的事情吗?我认为唯一合理的答案是“如果您已经在使用dplyr,也许是purrr,并且出于未来工作流程的原因,您希望数据帧相互嵌入,而不仅仅是一个简单的列表,这里是如何做到的。 "
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 2021-09-21
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2019-12-25
    相关资源
    最近更新 更多