如何擦除数据帧中的行R.

时间:2016-07-18 04:19:32

标签: r

我的数据框看起来像这样:

Quality     Data     Name  
  1          667     green  
  3          647     white   
  1          626     Blue  
  2          345     yellow  
  1          550     Blue 
  5          730     green 

我想要一个经过for循环的代码,然后取一个小于600且大于700的代码并删除行&&所有具有相同名称的并保存在另一个数据框中删除的那些 例子

 for i in nrow(df){  
       if (df$Data[i]<=600 || df$Data[i]>=700){ 
          Subset_by_name=subset(df,df$Name==df$Name[i]) (saves bad samples)
          (delete from data)
          Subset_by_name=data.frame(Subset_by_name) 
          bad_sample=rbind(Subset_by_name)  (saves all the bad data in a data frame)
    }  
    }

结果
bad_sample

Quality     Data    Name  
  1          667     green   
  1          626     Blue  
  2          345     yellow  
  1          550     Blue    
  5          730     green    

数据

Quality     Data    Name     
  3          647     white     

请帮助????

4 个答案:

答案 0 :(得分:2)

你真正需要的只是分组;请参阅the R tag info page了解有关其工作原理的大量教程。

bad <- df[df$Name %in% df[df$Data < 600 | df$Data > 700, 'Name'],]
good <- df[!df$Name %in% df[df$Data < 600 | df$Data > 700, 'Name'],]

bad
##   Quality Data   Name
## 1       1  667  green
## 3       1  626   Blue
## 4       2  345 yellow
## 5       1  550   Blue
## 6       5  730  green

good
##   Quality Data  Name
## 2       3  647 white

答案 1 :(得分:1)

我们可以使用split轻松完成此操作。输出将为list,如果我们需要两个data.frame个对象,则可以完成,但最好将其放在list

lst <- split(df1, with(df1, Name %in% Name[Data < 600 |Data > 700]))
good_sample <- lst[[1]]
good_sample
#   Quality Data  Name
#2       3  647 white

bad_sample <- lst[[2]]
bad_sample 
#  Quality Data   Name
#1       1  667  green
#3       1  626   Blue
#4       2  345 yellow
#5       1  550   Blue
#6       5  730  green

或者不是两次做同样的操作,

i1 <- with(df1, Name %in% Name[Data < 600 |Data > 700])
good_sample <- df1[i1,]
bad_sample <- df[!i1,]

注意:我们只使用一次操作split

答案 2 :(得分:1)

dplyr解决方案:

library(dplyr)
bad <- df %>% filter(Data < 600 | Data > 700)
good <- df %>% filter(!(Data < 600 | Data > 700))

或者只需一步即可添加新列并将所有数据保存在一起

df <- df %>% mutate(quality = ifelse((Data < 600 | Data > 700) , "bad", "good")) 

仅适用于需要良好数据的操作

df %>% filter(quality == "good") %>% select(-quality)

答案 3 :(得分:1)

这是一个data.table解决方案:

标识符列添加到原始表中,而不是将其拆分为两个表格会更好。

require(data.table)
dt[, result := "good"][Name %in% Name[Data %between% c(600, 700)], result := "bad"]
dt
#    Quality Data   Name result
# 1:       1  667  green    bad
# 2:       3  647  white    bad
# 3:       1  626   Blue    bad
# 4:       2  345 yellow   good
# 5:       1  550   Blue    bad
# 6:       5  730  green    bad

这会通过引用更新您的原始data.table

其中,

dt = fread('Quality     Data     Name  
           1          667     green  
           3          647     white   
           1          626     Blue  
           2          345     yellow  
           1          550     Blue 
           5          730     green')