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
frombase 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), ]
})
)