提问人:Gyokuro 提问时间:7/6/2023 最后编辑:Gyokuro 更新时间:7/6/2023 访问量:39
在 while 循环中条件应用函数的 R 问题
Problem in R with conditional application of a function in a while loop
问:
我对以下代码有问题(见下文)。 在代码的末尾,我计划了一个 while 循环(请参阅代码中的注释)。但是,当我手动测试它时,该循环不起作用(即多次运行代码)。
library(dplyr)
# Generate data
df = data.frame(var_a = c('A',NA, NA,'A',NA, NA, NA,NA, NA, NA),
var_b = c('B','B',NA, NA,NA, NA, NA,NA, NA, NA),
var_c = c(NA,'C','C',NA,NA, NA, NA,NA, NA, NA),
var_d = c('D',NA,'D','D',NA, NA, NA,NA, NA, NA),
var_e = c(NA,'Text',NA,'Text','Text', 'Text', NA,NA, 'Text', NA))
# Function to test if all values in a row from a specified list of variable equal NA
test_all_na <- function(df, na_test_vars){
df_test <- df %>%
mutate(all_na = rowSums(is.na(.[na_test_vars])) == length(na_test_vars))
return(df_test)
}
# Specify variables to test if all values in a row equal NA
na_test_vars <- c("var_a", "var_b", "var_c", "var_d")
# Generate new variable in df with logical vector if all values equal NA
df <- test_all_na(df, na_test_vars)
# Function to select randomly one value from a list of values based on probabilities
select_value <- function(old_value, prob, list_of_values){
new_value <- sample(list_of_values,
size = 1,
prob = prob)
return(new_value)
}
# Set condition to change values
condition <- df$all_na == TRUE
# Count occurances of TRUE in variable all_na
counter = sum(df$all_na)
print(counter)
### HERE SHOULD COME A WHILE LOOP: while counter > 0
# replace values with select_values function in various variables based on the condition
df$var_a <- ifelse(condition, sapply(df$var_a, select_value, prob = c(0.2, 0.8), list_of_values = c('A', NA)), df$var_a)
df$var_b <- ifelse(condition, sapply(df$var_b, select_value, prob = c(0.2, 0.8), list_of_values = c('B', NA)), df$var_b)
df$var_c <- ifelse(condition, sapply(df$var_c, select_value, prob = c(0.2, 0.8), list_of_values = c('C', NA)), df$var_c)
df$var_d <- ifelse(condition, sapply(df$var_d, select_value, prob = c(0.2, 0.8), list_of_values = c('D', NA)), df$var_d)
# Generate again variable in df with logical vector if all values equal NA
df <- test_all_na(df, na_test_vars)
# Count occurances of TRUE in variable all_na
counter = sum(df$all_na)
print(counter)
### END WHILE LOOP
第一次工作。在循环之前,有 6 条线在指定的变量中都等于 NA。在那之后,只有更少的行(取决于机会)。我实际期望的是,每次运行时,满足条件的行数都会减少。但事实并非如此。总是有不同的数字,有时更多,有时更少。所以循环到无穷大。你知道我做错了什么吗?感谢您的帮助!
答:
0赞
Ludwig
7/6/2023
#1
看来你只是错过了更新你的.在代码中,条件未更新,因此循环无法识别已完成的行。condition
代码对我来说工作正常,如下所示:
while(counter){
df$var_a <- ifelse(condition, sapply(df$var_a, select_value, prob = c(0.2, 0.8), list_of_values = c('A', NA)), df$var_a)
df$var_b <- ifelse(condition, sapply(df$var_b, select_value, prob = c(0.2, 0.8), list_of_values = c('B', NA)), df$var_b)
df$var_c <- ifelse(condition, sapply(df$var_c, select_value, prob = c(0.2, 0.8), list_of_values = c('C', NA)), df$var_c)
df$var_d <- ifelse(condition, sapply(df$var_d, select_value, prob = c(0.2, 0.8), list_of_values = c('D', NA)), df$var_d)
# Generate again variable in df with logical vector if all values equal NA
df <- df <- test_all_na(df, na_test_vars)
#Update condition
condition <- df$all_na == TRUE
# Count occurances of TRUE in variable all_na
counter = sum(df$all_na)
print(counter)
}
如果这不是您要找的答案,请告诉我!
评论