【问题标题】:subsetting a data frame based on a condition of one column [duplicate]根据一列的条件对数据框进行子集[重复]
【发布时间】:2016-10-28 01:16:07
【问题描述】:

我有一个大数据框。我想根据一列值的条件制作一个子集。说:

a<-data.frame(x=rep(1:5,5),y=rnorm(25),z=runif(25))

我想根据x 列的值创建一个子集。例如取 x=c(2,3,5) 的值并创建另一个数据框。

【问题讨论】:

    标签: r dataframe subset apply


    【解决方案1】:

    我们可以使用 dplyr 包中的值匹配函数 %in%filter 动词(一个很好的数据操作包)。

    library(dplyr)
    a1 <- data.frame(x = rep(1:5,5), y=rnorm(25), z=runif(25))
    a2 <- filter(a1, x %in% c(2,3,5))
    
    > a2
       x           y         z
    1  2  0.28184946 0.3564756
    2  3  0.05634123 0.9826746
    3  5 -0.58611510 0.8119334
    4  2  0.45211282 0.6267487
    5  3 -0.64741961 0.7600619
    6  5 -0.28781978 0.3216957
    7  2  0.51440342 0.5165707
    8  3  1.41958340 0.2328647
    9  5 -0.27751501 0.5400576
    10 2 -0.74835287 0.7976089
    11 3  2.42364991 0.4141980
    12 5  0.22175161 0.1051387
    13 2  1.54876157 0.6408956
    14 3  0.54940989 0.3968186
    15 5 -1.16333440 0.9359615
    

    【讨论】:

      【解决方案2】:

      或者你可以使用subset:

      filter <- c(2,5)
      subset(a, x %in% filter)
      

      或等效:

      subset(a, match(x, filter, nomatch = 0)>0)
      

      或者

      a[match(a$x, filter, nomatch = 0)>0,]
      
         # x           y         z
      # 2  2  0.76230930 0.9704342
      # 5  5 -1.61846247 0.5786633
      # 7  2  0.94024182 0.2805524
      # 10 5 -0.08851427 0.6426568
      # 12 2  0.78745436 0.1129637
      # 15 5 -2.41274754 0.4826690
      # 17 2 -0.37616238 0.9518877
      # 20 5  1.18745381 0.8110062
      # 22 2  0.03233245 0.4599623
      # 25 5 -2.28360189 0.4836900
      

      【讨论】:

        【解决方案3】:

        我们可以使用%in%

        a1 <- a[a$x %in% x,]
        

        仅对列“x”进行子集化

        a1 <- a[a$x %in% x, "x", drop=FALSE]
        

        如果我们需要对列“x”进行子集化,以基于x 向量创建vector

        v1 <- a$x[a$x %in% x]
        

        【讨论】:

        • 我们是否创建另一个向量?说 x=c(2,3,5)
        • @G1124E 我理解这个问题是基于x 向量中的值的子集'a'
        • 是的。我想有另一个基于 x 列上的值的 df。例如在上面的 df a 中,只取 x 列的值,即等于 2,3 和 5。
        • @G1124E 这就是第一个所做的。如果您只需要列“x”a1 &lt;- a[a$x %in% x,'x', drop= FALSE]
        • 感谢@akrun 的解释。明白了。
        猜你喜欢
        • 1970-01-01
        • 2022-06-18
        • 1970-01-01
        • 2011-03-27
        • 2013-08-15
        • 2011-08-13
        • 2019-02-16
        • 1970-01-01
        相关资源
        最近更新 更多