我正在处理一个数据集,其中包括不同人口统计变量的频率和百分比。我想创建一个循环,如果频率小于5,则可以将频率和百分比更改为NA。基本上,到目前为止,我使用的暴力方式是:
df <- df %>%
mutate(
# Suppressing N's
n_lep = ifelse(n_lep < 5, NA, n_lep),
n_eco = ifelse(n_eco < 5, NA, n_eco),
n_fem = ifelse(n_fem < 5, NA, n_fem),
# Suppressing P's
p_lep = ifelse(n_lep < 5, NA, p_lep),
p_eco = ifelse(n_eco < 5, NA, p_eco),
p_fem = ifelse(n_fem < 5, NA, p_fem)
)有比上面的3个更多的变量,这就是为什么我想找出一种方法,如果可能的话,通过函数和/或循环来做到这一点。谢谢!
发布于 2021-09-22 15:08:58
下面是你如何在base中做到这一点:
data(iris)
df <- iris
names(df)
#> "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
vars <- c("Sepal", "Petal")
fields <- c("Length", "Width")
for(v in vars){
for(f in fields){
df[,paste0(v, ".", f, "_new")] <- ifelse(df[,paste0(v, ".", f)] < 1, NA, df[,paste0(v, ".", f)])
}
}
head(df)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_new
#> 1 5.1 3.5 1.4 0.2 setosa 5.1
#> 2 4.9 3.0 1.4 0.2 setosa 4.9
#> 3 4.7 3.2 1.3 0.2 setosa 4.7
#> 4 4.6 3.1 1.5 0.2 setosa 4.6
#> 5 5.0 3.6 1.4 0.2 setosa 5.0
#> 6 5.4 3.9 1.7 0.4 setosa 5.4
#> Sepal.Width_new Petal.Length_new Petal.Width_new
#> 1 3.5 1.4 NA
#> 2 3.0 1.4 NA
#> 3 3.2 1.3 NA
#> 4 3.1 1.5 NA
#> 5 3.6 1.4 NA
#> 6 3.9 1.7 NA
Created on 2021-09-22 by the reprex package (v2.0.1)在您的示例中,您将使用vars <- c("n", "p")和fields <- c("lep", "eco", "fem"),并将每个paste0()中的.替换为_。
或者作为一个函数,如果编号为1到4的列包含您想要操作的值:
sapply(df[,1:4], function(x) ifelse(x<5, "NA", x))https://stackoverflow.com/questions/69286149
复制相似问题