如何编写for循环从kc2至kc10数据框生成加权均值列表?
解决方法:循环处理多个数据框计算加权均值
你的问题出在用字符串直接引用数据框列的方式不对——paste0("kc",i,"$withinss")生成的是文本字符串,不是实际的列数据,转成numeric只会得到NA,自然没法计算加权均值。下面给你两种可行的方案:
方案一:使用get()函数(贴近你原来的循环思路)
先初始化sum_square为空向量,然后循环时用get()根据字符串名称获取对应的数据框,再提取列计算:
# 初始化空向量 sum_square <- c() for (i in 2:10) { # 根据名称获取当前数据框 current_df <- get(paste0("kc", i)) # 计算加权均值并追加到sum_square sum_square <- append(sum_square, weighted.mean(x = current_df$withinss, w = current_df$size, na.rm = TRUE)) }
这个逻辑和你单数据框的执行语句完全一致,只是用get()动态获取每个kc开头的数据框,就能正确拿到withinss和size列的数据了。
方案二:用列表管理数据框(更推荐的R风格)
在R里,直接用字符串变量调用对象(比如get())虽然可行,但代码可读性和维护性不如把多个数据框放到一个列表里处理。你可以用mget()一次性把kc2到kc10打包成列表,再用sapply遍历计算:
# 将kc2到kc10的数据框存入一个列表 df_list <- mget(paste0("kc", 2:10)) # 遍历列表,计算每个数据框的加权均值,结果直接是向量 sum_square <- sapply(df_list, function(df) { weighted.mean(x = df$withinss, w = df$size, na.rm = TRUE) })
这种方式更简洁,而且如果以后要调整处理的数据框范围(比如加到kc15),只需要修改2:10为2:15即可,出错概率更低。
为什么你的原代码不生效?
你原代码里的问题有两个:
nam1和nam2是字符串(比如"kc2$withinss"),as.numeric(nam1)会把非数值的字符串转成NA,根本不是你要的列数据;lapply(c(as.numeric(nam1),as.numeric(nam2)), weighted.mean)的用法错误——weighted.mean需要x和w两个参数,你这样只传了单个向量,逻辑上就不成立。
内容的提问来源于stack exchange,提问作者peteraa
相关产品推荐
相关产品推荐

