【问题标题】:Trying to remove rows based on values in two columns尝试根据两列中的值删除行
【发布时间】:2017-04-15 09:37:32
【问题描述】:

我的数据格式如下:

 name  value1  rem 
-------------------
| tom  | 1   |  1
| tom  | 3   |  0
| tom  | 5   |  0
| bill | 7   |  0
| bill | 1   |  1
| bill | 3   |  0
| mark | 5   |  0
| mark | 9   |  0
| mark | 9   |  0

我要做的是删除“rem”中具有 1 的任何行以及与“rem”中具有 1 的行具有相同 ID 的任何行。所以在转换之后我想要它看起来像:

 name  value1  rem 
-------------------
| mark | 5   |  0
| mark | 9   |  0
| mark | 9   |  0

我不知道如何在 R 中使用逻辑命令执行此操作。我的实际数据有更多的行和列,所以我不能只按位置删除它们,即只删除前 6 行。我知道如何删除具有特定值的任何行。我想不通的是如何根据两行中的值删除行,其中之一是有条件的。以下是一些制作上述数据框的 R 代码:

name <- c("tom", "tom", "tom", "bill", "bill","bill","mark","mark","mark")
value1 <- c(1,3,5,7,1,3,5,9,9)
rem <- c(1,0,0,0,1,0,0,0,0)
df <- data.frame(name, value1, rem)

【问题讨论】:

    标签: r row


    【解决方案1】:

    另一种方法:

    # get the names that has 1 rem
    # then identify names not in that subset and 
    # use it to subset the df
    df[!(df$name %in% df$name[df$rem == 1]), ]
    

    【讨论】:

    • 以类似的方式,subset(df, !name %in% name[rem == 1])df %&gt;% filter(!name %in% name[rem == 1]) 也可以。
    • 谢谢你的工作就像一个魅力。我不确定我是否 100% 理解该命令。我得到的是(从外到内):“df[,] 部分正在返回所有一些子集或行。“!”表示“不”接下来的任何内容。“df$name %in%”是检查“df$name”的每一行是否在下面。最后,“df$name[df$rem == 1]”返回“df$rem”所在的所有“df$name”值的列表等于一。因此,内括号返回所有行,其中行中的名称在名称列表中,rem=1。这样对吗?
    • 是的,就是这样。 df$name[df$rem == 1]) 给出 rem = 1 的名称。df$name %in% df$name[df$rem == 1] 确定右边的名称,这些都是逻辑(就像你说的那样),! 只是否定它,这样你的名字就不带有 rem = 1。
    【解决方案2】:

    你可以这样做:

    install.packages('dplyr')
    library(dplyr)
    newdf<- df %>%
      group_by(name)%>%
      summarise(rem = sum(rem))
    
    newdf2<-filter(newdf, rem<1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多