【问题标题】:Subsetting data with a vec用 vec 对数据进行子集化
【发布时间】:2017-05-03 13:41:14
【问题描述】:

我想通过向量对数据框进行子集化,但为向量中的每个值复制子集:

data = data.frame(A = c(1,2,3,1), B = c(1,2,3,4))
vec = c(1, 1, 1)
subset(data, A %in% vec)
  A B
1 1 1
4 1 4

我想要的不是这个结果:

  A B
1 1 1
4 1 4
1 1 1
4 1 4
1 1 1
4 1 4

【问题讨论】:

  • B 来自哪里?它不在您的数据框中。

标签: r subset


【解决方案1】:

如果你使用purrr库,你可以这样做

map_df(vec, function(x) subset(data, A == x))

使用基础 R,它会是

do.call("rbind", lapply(vec, function(x) subset(data, A == x)))

【讨论】:

    【解决方案2】:

    你需要扩展它,即

    df2 <- subset(data, A %in% vec)
    df2[rep(rownames(df2), length(vec)),]
    #    A B
    #1   1 1
    #4   1 4
    #1.1 1 1
    #4.1 1 4
    #1.2 1 1
    #4.2 1 4
    

    【讨论】:

      【解决方案3】:

      data.table 的一个选项:

      library(data.table)
      setDT(data, key = 'A')[.(vec)]
      #   A B
      #1: 1 1
      #2: 1 4
      #3: 1 1
      #4: 1 4
      #5: 1 1
      #6: 1 4
      

      或者使用merge,当merge-by列中有重复值时,它会根据需要提供笛卡尔积

      merge(data, data.frame(A = vec))
      
      #   A B
      #1: 1 1
      #2: 1 1
      #3: 1 1
      #4: 1 4
      #5: 1 4
      #6: 1 4
      

      【讨论】:

        【解决方案4】:

        按照基本 R 拆分-应用-组合解决方案的思路,

        do.call(rbind, lapply(vec, function(i) data[data$A == i, ]))
           A B
        1  1 1
        4  1 4
        11 1 1
        41 1 4
        12 1 1
        42 1 4
        

        如果 vec 包含不均匀的混合值,这可能很有用。如果 vec 中有很多重复,此解决方案可能会很昂贵。在这种情况下,可以通过将其与 soto 的答案中的 rep 想法相结合来减少计算,如下所示。

        # count the number of repetitions by unique value
        uni <- table(vec)
        # extract unique values
        temp <- lapply(as.numeric(names(uni)), function(i) data[data$A == i, ])
        # combine results, repeating data.frames according to count
        do.call(rbind, temp[rep(seq_along(uni), each=uni)])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-26
          • 2017-11-21
          • 2021-12-06
          • 1970-01-01
          • 1970-01-01
          • 2013-08-15
          • 1970-01-01
          • 2023-03-22
          相关资源
          最近更新 更多