Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除不带循环的某些行_R_Loops_Dataframe - Fatal编程技术网

R 删除不带循环的某些行

R 删除不带循环的某些行,r,loops,dataframe,R,Loops,Dataframe,我有一个带有汽车维修数据的数据框。它还告诉我一辆汽车是否出了故障(并得到了修理)。我想把汽车抛锚后发生维修事件的所有争吵都处理掉 Car <- c('A','A','B') Damage <-c("Wheels","Motor","Motor") date <-c('01-01-2015','01-01-2016','01-01-2016') Broke_down <-c(1,0,1) df <- as.data.frame(cbind(Car,date,Dama

我有一个带有汽车维修数据的数据框。它还告诉我一辆汽车是否出了故障(并得到了修理)。我想把汽车抛锚后发生维修事件的所有争吵都处理掉

Car <- c('A','A','B')
Damage <-c("Wheels","Motor","Motor")
date <-c('01-01-2015','01-01-2016','01-01-2016')
Broke_down <-c(1,0,1)

df <- as.data.frame(cbind(Car,date,Damage,Broke_down))
最好的,
Felix基于OP帖子中的更新

library(data.table)
setDT(df)[, .SD[cummin(Broke_down) > 0], Car]
#    Car       date Damage Broke_down
#1:   A 01-01-2015 Wheels          1
#2:   B 01-01-2016  Motor          1

或者使用
ave
from
base R

df[with(df, ave(Broke_down, Car, FUN = cummin) > 0),]
#  Car       date Damage Broke_down
#1   A 01-01-2015 Wheels          1
#3   B 01-01-2016  Motor          1

也许有一种更优雅的方式,但是
lappy
do.call
执行以下技巧:

df_out <- do.call(rbind,lapply(unique(df$Car),function(x){

  df_sub <- df[df$Car==x,]
  df_sub[1:which(df_sub$Broke_down == 1)[1],]

}))

> df_out
  Car       date Damage Broke_down
1   A 01-01-2015 Wheels          1
3   B 01-01-2016  Motor          1

df_out这里有一个使用
split
lapply
的解决方案,数据准备与问题中的相同:

df2 <- do.call(
  rbind,
  lapply(
    split(df, df$Car),
    function(x){
      x[1:which.min(x$Broke_down==1), ]
    })
)

df2您的示例选择得不好,因为它恰好可以用一种更简单的方法轻松解决,尽管这种方法不适用于其他情况。更好地选择示例数据可以防止过于简单的解决方案可能是
which.min
,而不是
min(which(…)
?)谢谢你的建议,我相应地修改了答案。
df2 <- do.call(
  rbind,
  lapply(
    split(df, df$Car),
    function(x){
      x[1:which.min(x$Broke_down==1), ]
    })
)