【问题标题】:Filtering a data frame过滤数据框
【发布时间】:2011-11-23 23:16:24
【问题描述】:

我已读取矩阵形式的 csv 文件(具有 m 行和 n 列)。我想通过以口头形式进行过滤来过滤矩阵:

从 x 列中选择该行中另一列的值等于“blabla”的所有值。

这就像数据库中的一个选择语句,我说我对需要满足这些约束的矩阵子集感兴趣。

我怎样才能在 r 中做到这一点?我将数据作为数据框,并且可以通过标题访问它。 data["column_values" = "15"] 不会给我返回名为 column_values 的列只有值 15 的行。

谢谢

【问题讨论】:

    标签: r select filter


    【解决方案1】:

    你说你只想要 column_values 为 15 的列 x 值,对吧?

    subset(dat, column_values==15, select=x)
    

    我认为这可能是一个数据框,因此您可能需要 unlist() 它甚至“取消分解”它。

    > dat
      Subject Product
    1       1   ProdA
    2       1   ProdB
    3       1   ProdC
    4       2   ProdB
    5       2   ProdC
    6       2   ProdD
    7       3   ProdA
    8       3   ProdB
    > subset(dat, Subject==2, Product)
      Product
    4   ProdB
    5   ProdC
    6   ProdD
    > unlist( subset(dat, Subject==2, Product) )
    Product1 Product2 Product3 
       ProdB    ProdC    ProdD 
    Levels: ProdA ProdB ProdC ProdD
    > as.character( unlist( subset(dat, Subject==2, Product) ) )
    [1] "ProdB" "ProdC" "ProdD"
    

    如果您想要所有列,您可以删除第三个参数(select= 参数):

    subset(dat, Subject==2 )
    
      Subject Product
    4       2   ProdB
    5       2   ProdC
    6       2   ProdD
    

    【讨论】:

    • 感谢您的回复。实际上,我想恢复整个子集,我的意思是其他列也是如此。你能告诉我如何获得结果 2 Prod B; 2 产品; 2 ProdC 回来了?就我而言,我想像 Jack 显示的那样过滤不止一列。但它仍然无法正常工作。你能看到错误吗?谢谢!
    • 发布了编辑。您可以在带引号或不带引号的列名的向量中指定任何因子组合。 subset 也将省略所有我讨厌但其他人欣赏的烦人的 NA 比赛。
    • 我尝试了子集(数据,V1=="随机",V6=="独立")。但它不起作用。 V1 和 V6 是两个列标题。返回的结果是 > subset(data, V1=="stochastic", V6=="independent") 具有 0 列和 196 行的数据框v1 和 v6 满意吗?
    • 也许:subset(data, V1=="stochastic" & V6=="independent") 。也许你可以发布 dput(head(data))?
    • 对于 R 中的分解变量,您可以使用 varhandle 包中的函数 unfactor()
    【解决方案2】:

    假设dat是有问题的数据框,col是列名,"value"是你想要的值,你可以这样做

    dat[dat$col=="value",]

    这会获取dat 的所有行,dat$col=="value" 的所有行以及所有列。

    【讨论】:

    • 如何选择两列?一列工作正常。比如我试过这个 data[data$V1=="stochastic",data$V6=="independent",] 两列多选时如何实现和操作?
    • data[data$V1=="stochastic" && data$V6=="independent",]
    • 数据[data$V1=="stochastic" && data$V6=="stochastic",] [1] V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 (或 0-length row.names)它不显示结果。我确信结果不为空。有什么想法吗?
    • 糟糕,抱歉,试试data[data$V1=="stochastic" & data$V6=="independent",]。我一直忘记,R 与地球上几乎所有其他语言不同,它使用 & 来表示大多数其他语言所使用的 && (sites.stat.psu.edu/~dhunter/R/html/base/html/Logic.html)。
    • df=as.data.frame(cbind(1:5,6:10,11:15)) df[df$V1==3 & df$V2==8,] 产生正确的数据(即元组(3,8,13)所代表的行)。
    【解决方案3】:

    首先,请注意 matrixdata.frame 在 R 中是不同的东西。我想你有一个 data.frame(因为这是 read.csv() 返回的内容)。 data.frame 已命名列(如果您不给它们命名,则会为您创建通用的)。

    您可以通过指示您想要的行和/或您想要的列来对data.frame 进行子集化。指定哪些行的最简单方法是使用逻辑向量,通常使用data.frame 的特定列进行比较。例如,data[["column values"]] == "15" 将生成一个逻辑向量,即 TRUE,如果 column values 列中的相应条目是字符串“15”(因为它在引号中,它是一个字符串,而不是数字)。您可以根据需要制定尽可能复杂的选择标准(将逻辑向量与&| 组合)以指定所需的行。该向量成为索引中的第一个参数。

    列名或数字的列表可以是第二个参数。如果缺少任一参数,则假定所有行(或列)。

    把这些放在一起,你会得到像这样的例子

    data[data[["column values"]] == "15", ]
    

    或使用实际数据集 (mtcars)

    mtcars[mtcars$am == 1, ]
    mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg"]
    mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg", drop=FALSE]
    mtcars[mtcars$hp > 100, c("mpg", "carb")]
    

    查看每个条件(第一个参数,例如mtcars$am == 1 & mtcars$hp > 100)返回的内容,以更好地了解索引的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2011-10-29
      • 2018-10-22
      相关资源
      最近更新 更多