我的数据集包含许多以相似名称开头的列
`CropType<-maize, beans,peas
NumberSM<-200,300,NA
PercentageSM<-90%,50%,NA
NumberLM<-600,NA,234
PercentageLM<-20%,NA,78%
df1<-data.frame(CropType,NumberSM,PercentageSM,NumberLM,PercentageLM)`
我希望请求一行代码,用 0.0 替换以 Number 开头的列中缺失的任何值,并用 0.0% 替换以 Percentage 开头的列中缺失任何值的任何列。
我想要的输出是
`CropType<-maize, beans,peas
NumberSM<-200,300,0.0
PercentageSM<-90%,50%,0.0%
NumberLM<-600,0.0,234
PercentageLM<-20%,0.0%,78%
df1<-data.frame(CropType,NumberSM,PercentageSM,NumberLM,PercentageLM)`
这个我试过了
`df1 %>%
mutate(NumberLM=replace(NumberLM,is.na(NumberLM),0.0),
PercentageLM=replace(PercentageLM,is.na(PercentageLM),'0.0%'))`
但是我有几列需要替换,并且我避免引用每一列来替换
这是一种使用
mutate/across
的方法。请参阅代码注释以获取解释。
CropType <- c("maize", "beans", "peas")
NumberSM <- c(200,300,NA)
PercentageSM <- c("90%","50%",NA)
NumberLM <- c(600,NA,234)
PercentageLM <- c("20%",NA,"78%")
df1 <- data.frame(CropType,NumberSM,PercentageSM,NumberLM,PercentageLM)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
# here mutate all columns where is.numeric returns TRUE
df1 %>%
mutate(across(where(is.numeric), ~replace(.x, is.na(.x), 0.0)))
#> CropType NumberSM PercentageSM NumberLM PercentageLM
#> 1 maize 200 90% 600 20%
#> 2 beans 300 50% 0 <NA>
#> 3 peas 0 <NA> 234 78%
# to change the percentages, first determine which
# columns have a '%' in them, then a mutate/across
# similar to the one above does the trick
i_perc <- sapply(df1, \(x) any(grepl("%", x)))
df1 %>%
mutate(across(which(i_perc), ~ replace(.x, is.na(.x), "0.0%")))
#> CropType NumberSM PercentageSM NumberLM PercentageLM
#> 1 maize 200 90% 600 20%
#> 2 beans 300 50% NA 0.0%
#> 3 peas NA 0.0% 234 78%
创建于 2024-03-18,使用 reprex v2.1.0