如何为DataFrame创建依赖另一列值的新列?R语言代码求助
解决DataFrame根据grupo列生成prcganancia列的问题
先拆解你原代码的几个核心问题:
- 循环逻辑完全错误:
for (dff$prcganancia in dff)不符合R的遍历规则,没法实现逐行赋值 - 语法错误:R里没有
elseif,正确写法是else if(带空格) - 赋值错误:用了比较运算符
==,赋值应该用<-或= - 向量判断错误:直接对整列
dff$grupo ==1判断会返回布尔向量,无法逐行匹配
下面给出两种高效的向量化解决方案(R语言优先用向量化操作,比循环快得多):
方案1:用dplyr的case_when(代码清晰易维护)
# 先安装加载dplyr(没装过的话执行第一行) # install.packages("dplyr") library(dplyr) dff <- dff %>% mutate(prcganancia = case_when( grupo == 1 ~ 0.3681, grupo == 2 ~ 0.2320, grupo == 3 ~ 0.2851, grupo == 4 ~ 0.4443, grupo == 5 ~ 0.3353, grupo == 6 ~ 0.2656, grupo == 7 ~ 0.2597, grupo == 8 ~ 0.2211, grupo == 9 ~ 0.3782, grupo == 10 ~ 0.3752, TRUE ~ NA_real_ # 处理grupo不在1-10的情况,可按需修改 ))
方案2:用命名向量映射(代码更简洁)
# 创建grupo和prcganancia的映射关系 ganancia_map <- c( 1 = 0.3681, 2 = 0.2320, 3 = 0.2851, 4 = 0.4443, 5 = 0.3353, 6 = 0.2656, 7 = 0.2597, 8 = 0.2211, 9 = 0.3782, 10 = 0.3752 ) # 直接通过索引生成新列 dff$prcganancia <- ganancia_map[dff$grupo]
非要用循环的话(不推荐,数据量大时很慢)
如果一定要用循环实现,正确写法如下:
# 先初始化新列 dff$prcganancia <- NA_real_ # 遍历每一行索引 for(i in 1:nrow(dff)){ grupo_val <- dff$grupo[i] if(grupo_val == 1){ dff$prcganancia[i] <- 0.3681 } else if(grupo_val == 2){ dff$prcganancia[i] <- 0.2320 } else if(grupo_val == 3){ dff$prcganancia[i] <- 0.2851 } else if(grupo_val == 4){ dff$prcganancia[i] <- 0.4443 } else if(grupo_val == 5){ dff$prcganancia[i] <- 0.3353 } else if(grupo_val == 6){ dff$prcganancia[i] <- 0.2656 } else if(grupo_val == 7){ dff$prcganancia[i] <- 0.2597 } else if(grupo_val == 8){ dff$prcganancia[i] <- 0.2211 } else if(grupo_val == 9){ dff$prcganancia[i] <- 0.3782 } else if(grupo_val == 10){ dff$prcganancia[i] <- 0.3752 } }
内容的提问来源于stack exchange,提问作者KingP
相关产品推荐
相关产品推荐

