R语言使用for循环与if else编写check_even函数结果全乘3问题排查
问题原因分析
- 行列索引顺序错误,且错误对列名字符串做下标索引
你传入的col_test和col_multiply都是单个列名字符串,原代码写的col_test[i]是尝试取字符串的第i个字符,完全不符合取指定列第i行值的需求;同时取值时行列顺序写反,正确写法应为df[i, col_test],即先指定行号i,再指定列名。
- 行列索引顺序错误,且错误对列名字符串做下标索引
- 赋值范围错误
原代码df[,'res'] = xxx是每次循环都对整个res列做全量覆盖,而非仅修改当前循环行i的res值,会导致最终res列全是最后一次循环的计算结果。
- 赋值范围错误
- return语句位置错误
return被放在了for循环内部,循环只执行第一行(i=1)就会直接返回结果,而第一行INT1的值为1是奇数,所以全列都是乘3的结果,和你观测到的现象完全一致。
- return语句位置错误
修正后的完整代码
# 测试数据集 df_test = data.frame(INT1 = c(1:10), INT2 = (sample(x = c(20:100),size = 10, replace = F))) check_even = function(df, col_test, col_multiply){ # 先初始化res列,避免循环中逐行赋值效率问题 df$res <- NA for(i in 1:nrow(df)){ # 取当前行col_test列的值判断奇偶 if(df[i, col_test] %% 2 == 0){ # 偶数则当前行col_multiply列乘2赋值给res对应行 df[i, 'res'] = df[i, col_multiply] * 2 } else { # 奇数则乘3 df[i, 'res'] = df[i, col_multiply] * 3 } } # 循环结束后再返回完整df return(df) } # 测试调用 check_even(df_test, 'INT1', 'INT2')
内容的提问来源于stack exchange,提问作者wickylee
相关产品推荐
相关产品推荐

