【问题标题】:Building a list of subsets of a data frame according to cell values in R根据 R 中的单元格值构建数据框的子集列表
【发布时间】:2019-07-01 10:39:44
【问题描述】:

我有一个要剪切的数据框,并将每个子集保留为新列表的一个元素。切割是根据单元格的值给出的。例如,如果我有:

> df

     X1   X2
1     red  1
2    blue  3
3   green  2
4  pierre 10
5    pink  4
6    blue  3
7   green  2
8    eric 25
9  purple  8
10    red  1
11   anna 30
12   blue  3
13  green  2
14  black  5
15 yellow  6
16  marie 40
17 violet  7 

> df2

      X1    X2  X3
1 pierre  eric  77
2   anna marie 100

我想在其中限制的子集中切割 df,其中 X1 的值等于 df2 中 X1(上限)和 X2(下限)给出的值。 为了更清楚,我希望我的列表看起来像这样:

> list
[[1]] 
     X1   X2    
4  pierre 10
5    pink  4
6    blue  3
7   green  2
8    eric 25
[[2]]
     X1   X2
11   anna 30
12   blue  3
13  green  2
14  black  5
15 yellow  6
16  marie 40

我尝试使用 for 循环来做到这一点:

> for (i in 1:nrow(df2)){
   list[i]<-list(df[which(df[,"X1"]==df2[i,"X1"]):which(df[,"X1"]==df2[i,"X2"]),])
  }     

但我收到以下错误消息:

Error in list[i] <- list(df[which(df[, "X1"] == df2[i, "X1"]):which(df[,  : 
  object of type 'builtin' is not subsettable

您知道什么是错误的和/或获得预期结果的不同方法吗?

【问题讨论】:

    标签: r list dataframe for-loop subset


    【解决方案1】:

    使用for 循环有效,但@zx8754 的mapply() 方法应该更有效。

    test <- vector("list", nrow(df2))
    for(i in 1:nrow(df2)){
      x <- which(df[, "X1"] == df2[i, "X1"])
      y <- which(df[, "X1"] == df2[i, "X2"])
      test[[i]] <- df[x:y,]
    }
    
    > test
    [[1]]
          X1 X2
    4 pierre 10
    5   pink  4
    6   blue  3
    7  green  2
    8   eric 25
    
    [[2]]
           X1 X2
    11   anna 30
    12   blue  3
    13  green  2
    14  black  5
    15 yellow  6
    16  marie 40
    

    【讨论】:

      【解决方案2】:

      使用映射

      mapply(function(x, y){
        df[ which(df$X1 == x):which(df$X1 == y), ]
        }, x = df2$X1, y = df2$X2, SIMPLIFY = FALSE)
      # $pierre
      # X1 X2
      # 4 pierre 10
      # 5   pink  4
      # 6   blue  3
      # 7  green  2
      # 8   eric 25
      # 
      # $anna
      # X1 X2
      # 11   anna 30
      # 12   blue  3
      # 13  green  2
      # 14  black  5
      # 15 yellow  6
      # 16  marie 40
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 2011-09-10
        • 2023-01-16
        • 2020-08-19
        • 1970-01-01
        • 2021-12-16
        • 2021-10-13
        相关资源
        最近更新 更多