【问题标题】:R how to retrieve data from data.frame with multiple conditionsR如何从具有多个条件的data.frame中检索数据
【发布时间】:2015-07-08 19:44:53
【问题描述】:

我想知道如何在 R 中执行一些基本的数据操作。我想做的是以下内容。

我有一个具有以下模式的数据表:

  V1     V2     V3    
  ABC     X     24
  ABC     Y     30
  EFG     X     4
  EFG     Y     28
  HIJ     P     40
  HIJ     Y     41
  PKL     X     32
  1. 现在我想检索 V1 的所有值/对,其中它没有对应的值,而不是 V2 上的 X。在上面的数据集中,这个子集是

    HIJ     P    40
    HIJ     Y    41
    

由于这对 HIJ 的 V2 值都不为 X。

  1. 我还想检索不重复两次的所有 V1 值。在上面的例子中,它会是

    PKL  X 32
    

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    如果您决定使用data.frame,也可以使用dplyr

    library(dplyr)
    
    # Problem 1
    df %>% group_by(V1) %>% filter(all(V2 != "X"))
    
    #    V1 V2 V3
    # 1 HIJ  P 40
    # 2 HIJ  Y 41
    
    # Problem 2
    df %>% group_by(V1) %>% filter(n() == 1)
    
    #    V1 V2 V3
    # 1 PKL  X 32
    

    如果你的数据是

    V1 <- c("ABC", "ABC", "EFG", "EFG", "HIJ", "HIJ", "PKL")
    V2 <- c("X", "Y", "X", "Y", "P", "Y", "X")
    V3 <- c(24,30,4,28,40,41,32)
    df <- data.frame (V1,V2,V3)
    

    【讨论】:

      【解决方案2】:

      你提到了data.table,所以这里有两种可能的方法来处理这两个请求

      library(data.table)
      

      1.

      setDT(df)[, .SD[all(V2 != "X")], by = V1]
      #     V1 V2 V3
      # 1: HIJ  P 40
      # 2: HIJ  Y 41
      

      2.

      df[, .SD[.N == 1L], by = V1]
      #     V1 V2 V3
      # 1: PKL  X 32
      

      或者(更优化的版本)

      indx <- df[, .(indx = .I[.N == 1L]), by = V1]$indx
      df[indx]
      #     V1 V2 V3
      # 1: PKL  X 32
      

      【讨论】:

        【解决方案3】:

        假设您的数据位于名为 foodata.frame 中。

        对于 1. 我喜欢by()byV1的所有条目看"X"是不是%in%对应V2的条目。将其包裹在 names()which() 中。

        hits <- names(which(with(foo,by(V2,V1,function(xx)!"X"%in%xx))))
        foo[foo$V1 %in% hits,]
           V1 V2 V3
        5 HIJ  P 40
        6 HIJ  Y 41
        

        对于 2. 这更简单:

        names(which(table(foo$V1)<2))
        [1] "PKL"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          相关资源
          最近更新 更多