【问题标题】:R compare columns and grep the false valuesR比较列并grep错误值
【发布时间】:2016-10-03 09:43:45
【问题描述】:

我有一个数据框,首先我比较它们以创建一列布尔值,然后我想通过在前两列中对它们进行 grep 来知道哪个是假的。

df:
    200610-1    200610-10   
AA  AA  TRUE
CC  CC  TRUE
AA  AA  TRUE
AA  EE  FALSE
AA  AA  TRUE
RR  RR  TRUE
AA  AA  TRUE
FF  AA  FALSE
NN  NN  TRUE
AA  AA  TRUE
BB  RR  FALSE

desired output:
4 AA EE
8 FF AA
11 BB RR

我比较了它们

 table(df[,2] == df[,3])

但是我不知道如何将布尔值grep到数据框值中。谢谢。

【问题讨论】:

  • 这看起来不像 R 数据框。列名是非法的。
  • @42 理论上可以通过更改colnames 或使用df[[somestring]] 创建变量来将任何内容作为列名。当然,你不应该这样做!
  • 但是它们不会以这种方式显示,并且会有三个列名。
  • @42 同意,这只是一句毫无意义的评论。我猜显示是由于stackoverflow中的复制粘贴造成的。也可以有一个空的列名(使用“”作为字符串)。我总是惊讶于 R 在命名东西时实际上是多么宽松。就像您可以使用空格或任何使用 assign...

标签: r dataframe boolean


【解决方案1】:

不用创建布尔列(我猜在输出中我们不需要它),只需比较第一个和第二个比较来创建一个返回布尔值的表达式并使用它来对行进行子集化。

df[df[,1]!= df[,2],]
#    200610-1 200610-10
#4        AA        EE
#8        FF        AA
#11       BB        RR

【讨论】:

    【解决方案2】:

    或者使用你的布尔列:

    df[which(df[,3]==F),]
    
    4  AA EE FALSE
    8  FF AA FALSE
    11 BB RR FALSE
    

    【讨论】:

      【解决方案3】:

      假设列是字符,这是另一种方式:

      df[-which(df[,1]==df[,2]),]
      

      如果你想使用grep,试试

      df[!apply(df, 1, function(x) grepl(x[1], x[2])),]
      
      4  AA EE
      8  FF AA
      11 BB RR
      

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多