我的数据框看起来像这样:
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
请帮助????
答案 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')