如何根据条件删除行
How to remove rows based on condition
在示例数据集中,我有公司及其各自 exit_date,因为如果一家公司在 2018 年离开直到财政年度结束,我想显示该公司名称,我需要在财政年度之后显示公司名称应删除该行的年份
Company <- c("Nokia","Samsung","Moto","Blue Berry","Vivo","Redmi")
Exit_date <- c(NA, "2019-08-25", "2019-12-31", "2018-12-31","2020-09-15",NA)
data <- data.frame(Company,Exit_date)
data$Exit_date <-as.Date(data$Exit_date,format = "%Y-%m-%d")
财政年度:
a = as.Date("2018-04-01")
b = as.Date("2019-04-01")
c = as.Date("2020-04-01")
d = as.Date("2021-04-01")
e = as.Date("2022-04-01")
我尝试使用 if 但没有得到任何正确的输出:
if(data$exit_date > a & data$exit_date < b){
data = data[!data$Exit_date,]
}else if (data$exit_date > b & data$exit_date < c){
data = data[!data$Exit_date,]
}else if (data$exit_date > c & data$exit_date < d){
data = data[!data$Exit_date,]
}else if (data$exit_date > d & data$exit_date < e){
data = data[!data$Exit_date,]
}else if (data$Exit_date==NA){
}
如有任何想法,我们将不胜感激。
library(tidyverse)
Company <- c("Nokia", "Samsung", "Moto", "Blue Berry", "Vivo", "Redmi")
Exit_date <- c(NA, "2019-08-25", "2019-12-31", "2018-12-31", "2020-09-15", NA)
data <- data.frame(Company, Exit_date)
data$Exit_date <- as.Date(data$Exit_date, format = "%Y-%m-%d")
# must be in ascending order
a <- as.Date("2018-04-01")
b <- as.Date("2019-04-01")
c <- as.Date("2020-04-01")
d <- as.Date("2021-04-01")
e <- as.Date("2022-04-01")
data <-
data %>%
as_tibble() %>%
mutate(
left_fiscal = case_when(
Exit_date < a ~ a,
Exit_date < b ~ b,
Exit_date < c ~ c,
Exit_date < d ~ d,
Exit_date < e ~ e
)
)
data
#> # A tibble: 6 x 3
#> Company Exit_date left_fiscal
#> <chr> <date> <date>
#> 1 Nokia NA NA
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 4 Blue Berry 2018-12-31 2019-04-01
#> 5 Vivo 2020-09-15 2021-04-01
#> 6 Redmi NA NA
# remove companies left in fiscal year 2018
data %>%
filter(! left_fiscal == b)
#> # A tibble: 3 x 3
#> Company Exit_date left_fiscal
#> <chr> <date> <date>
#> 1 Samsung 2019-08-25 2020-04-01
#> 2 Moto 2019-12-31 2020-04-01
#> 3 Vivo 2020-09-15 2021-04-01
由 reprex package (v2.0.0)
创建于 2022-02-22
您的 if 语句的问题是 data$Exit_date
不是逻辑向量,因此您不能使用 data[!data$Exit_date,]
删除行。
另一件事是将您的 if 语句相加:您似乎只想要匹配 a、b、c、d 或 e 的退出日期(因为您要删除它们之间的所有内容)。但这似乎不是想要的输出?
要获得他们离开的年份,如果您的日期在向量中会更容易:
您可以将条件(>= 到 x 日期)相加以获得向量中的年份索引,如下所示:
Fiscal_years <- c(
as.Date("2018-04-01"),
as.Date("2019-04-01"),
as.Date("2020-04-01"),
as.Date("2021-04-01"),
as.Date("2022-04-01")
)
data <- within(data,{
Exit_fiscal <- Fiscal_years[rowSums(sapply(Fiscal_years, function(x) Exit_date >= x))+1]
})
您还可以使用库 lubridate
来匹配年份:
Fiscal_years <- c(
"2018" = as.Date("2018-04-01"),
"2019" = as.Date("2019-04-01"),
"2020" = as.Date("2020-04-01"),
"2021" = as.Date("2021-04-01"),
"2022" = as.Date("2022-04-01")
)
library(lubridate)
data <- within(data,{
Exit_fiscal <- Fiscal_years[as.character(year(Exit_date) + (month(Exit_date) >= 4))]
})
然后过滤:
data <- data[!data$Exit_fiscal %in% Fiscal_years["2019"],]
#> Company Exit_date Exit_fiscal
#> 1 Nokia <NA> <NA>
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 5 Vivo 2020-09-15 2021-04-01
#> 6 Redmi <NA> <NA>
或者如果您不想保留 NA 值:
data <- data[which(data$Exit_fiscal != Fiscal_years["2019"]),]
#> Company Exit_date Exit_fiscal
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 5 Vivo 2020-09-15 2021-04-01
在示例数据集中,我有公司及其各自 exit_date,因为如果一家公司在 2018 年离开直到财政年度结束,我想显示该公司名称,我需要在财政年度之后显示公司名称应删除该行的年份
Company <- c("Nokia","Samsung","Moto","Blue Berry","Vivo","Redmi")
Exit_date <- c(NA, "2019-08-25", "2019-12-31", "2018-12-31","2020-09-15",NA)
data <- data.frame(Company,Exit_date)
data$Exit_date <-as.Date(data$Exit_date,format = "%Y-%m-%d")
财政年度:
a = as.Date("2018-04-01")
b = as.Date("2019-04-01")
c = as.Date("2020-04-01")
d = as.Date("2021-04-01")
e = as.Date("2022-04-01")
我尝试使用 if 但没有得到任何正确的输出:
if(data$exit_date > a & data$exit_date < b){
data = data[!data$Exit_date,]
}else if (data$exit_date > b & data$exit_date < c){
data = data[!data$Exit_date,]
}else if (data$exit_date > c & data$exit_date < d){
data = data[!data$Exit_date,]
}else if (data$exit_date > d & data$exit_date < e){
data = data[!data$Exit_date,]
}else if (data$Exit_date==NA){
}
如有任何想法,我们将不胜感激。
library(tidyverse)
Company <- c("Nokia", "Samsung", "Moto", "Blue Berry", "Vivo", "Redmi")
Exit_date <- c(NA, "2019-08-25", "2019-12-31", "2018-12-31", "2020-09-15", NA)
data <- data.frame(Company, Exit_date)
data$Exit_date <- as.Date(data$Exit_date, format = "%Y-%m-%d")
# must be in ascending order
a <- as.Date("2018-04-01")
b <- as.Date("2019-04-01")
c <- as.Date("2020-04-01")
d <- as.Date("2021-04-01")
e <- as.Date("2022-04-01")
data <-
data %>%
as_tibble() %>%
mutate(
left_fiscal = case_when(
Exit_date < a ~ a,
Exit_date < b ~ b,
Exit_date < c ~ c,
Exit_date < d ~ d,
Exit_date < e ~ e
)
)
data
#> # A tibble: 6 x 3
#> Company Exit_date left_fiscal
#> <chr> <date> <date>
#> 1 Nokia NA NA
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 4 Blue Berry 2018-12-31 2019-04-01
#> 5 Vivo 2020-09-15 2021-04-01
#> 6 Redmi NA NA
# remove companies left in fiscal year 2018
data %>%
filter(! left_fiscal == b)
#> # A tibble: 3 x 3
#> Company Exit_date left_fiscal
#> <chr> <date> <date>
#> 1 Samsung 2019-08-25 2020-04-01
#> 2 Moto 2019-12-31 2020-04-01
#> 3 Vivo 2020-09-15 2021-04-01
由 reprex package (v2.0.0)
创建于 2022-02-22您的 if 语句的问题是 data$Exit_date
不是逻辑向量,因此您不能使用 data[!data$Exit_date,]
删除行。
另一件事是将您的 if 语句相加:您似乎只想要匹配 a、b、c、d 或 e 的退出日期(因为您要删除它们之间的所有内容)。但这似乎不是想要的输出?
要获得他们离开的年份,如果您的日期在向量中会更容易: 您可以将条件(>= 到 x 日期)相加以获得向量中的年份索引,如下所示:
Fiscal_years <- c(
as.Date("2018-04-01"),
as.Date("2019-04-01"),
as.Date("2020-04-01"),
as.Date("2021-04-01"),
as.Date("2022-04-01")
)
data <- within(data,{
Exit_fiscal <- Fiscal_years[rowSums(sapply(Fiscal_years, function(x) Exit_date >= x))+1]
})
您还可以使用库 lubridate
来匹配年份:
Fiscal_years <- c(
"2018" = as.Date("2018-04-01"),
"2019" = as.Date("2019-04-01"),
"2020" = as.Date("2020-04-01"),
"2021" = as.Date("2021-04-01"),
"2022" = as.Date("2022-04-01")
)
library(lubridate)
data <- within(data,{
Exit_fiscal <- Fiscal_years[as.character(year(Exit_date) + (month(Exit_date) >= 4))]
})
然后过滤:
data <- data[!data$Exit_fiscal %in% Fiscal_years["2019"],]
#> Company Exit_date Exit_fiscal
#> 1 Nokia <NA> <NA>
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 5 Vivo 2020-09-15 2021-04-01
#> 6 Redmi <NA> <NA>
或者如果您不想保留 NA 值:
data <- data[which(data$Exit_fiscal != Fiscal_years["2019"]),]
#> Company Exit_date Exit_fiscal
#> 2 Samsung 2019-08-25 2020-04-01
#> 3 Moto 2019-12-31 2020-04-01
#> 5 Vivo 2020-09-15 2021-04-01