R代码调试求助:遇'na.rm'与'x'未找到错误及作业代码问题
解决R代码中的两个错误及作业完整实现
错误原因解析
- 对象'na.rm'未找到:出现在
select(X17856731, Y, T = 0)这类代码中,select函数语法错误——你试图在选择列时给T赋值为0,这会创建一个无效的新变量,后续操作中因逻辑混乱引发变量引用错误。 - Error in unique(x) : object 'x' not found:出现在
df_selects代码块,一是管道操作语法错误X17856731 :: selects完全无效,正确写法是X17856731 %>% select();二是引用了不存在的treatment变量,还错误地把Y变量重编码为处理组标识,逻辑完全错位,导致函数调用时找不到所需参数。
修正后的完整代码(对应作业三步要求)
# 加载必要包 library(tidyverse) library(readr) library(moments) # 提前加载,避免重复安装 # 读取数据(只需要读一次) df <- read_csv("17856731.csv") View(df) # ---------------------- 第一步:描述性统计量与图表 ---------------------- # 自定义众数函数(修正参数传递逻辑) get_mode <- function(x, na.rm = FALSE) { if (na.rm) { x <- na.omit(x) } ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] } # 变量X的描述性统计 cat("变量X的描述性统计:\n") cat("均值:", mean(df$X, na.rm = TRUE), "\n") cat("中位数:", median(df$X, na.rm = TRUE), "\n") cat("众数:", get_mode(df$X, na.rm = TRUE), "\n") cat("方差:", var(df$X, na.rm = TRUE), "\n") cat("标准差:", sd(df$X, na.rm = TRUE), "\n") cat("偏度:", skewness(df$X, na.rm = TRUE), "\n") cat("四分位距:", IQR(df$X, na.rm = TRUE), "\n\n") # 变量Y的描述性统计 cat("变量Y的描述性统计:\n") cat("均值:", mean(df$Y, na.rm = TRUE), "\n") cat("中位数:", median(df$Y, na.rm = TRUE), "\n") cat("众数:", get_mode(df$Y, na.rm = TRUE), "\n") cat("方差:", var(df$Y, na.rm = TRUE), "\n") cat("标准差:", sd(df$Y, na.rm = TRUE), "\n") cat("偏度:", skewness(df$Y, na.rm = TRUE), "\n") cat("四分位距:", IQR(df$Y, na.rm = TRUE), "\n\n") # 变量分布图表 # X的直方图+密度曲线 ggplot(df, aes(x = X)) + geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", alpha = 0.7) + geom_density(color = "darkblue") + labs(title = "变量X的分布", x = "X", y = "密度") + theme_minimal() # Y的直方图+密度曲线 ggplot(df, aes(x = Y)) + geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightgreen", alpha = 0.7) + geom_density(color = "darkgreen") + labs(title = "变量Y的分布", x = "Y", y = "密度") + theme_minimal() # ---------------------- 第二步:对比T=1和T=0时的Y值 ---------------------- # 分组计算Y的核心统计量 group_stats <- df %>% group_by(T) %>% summarize( mean_Y = mean(Y, na.rm = TRUE), median_Y = median(Y, na.rm = TRUE), sd_Y = sd(Y, na.rm = TRUE) ) print(group_stats) # 可视化对比:箱线图 ggplot(df, aes(x = factor(T), y = Y)) + geom_boxplot(fill = c("pink", "lightyellow")) + labs(title = "不同处理组的Y值分布", x = "处理组(T=1为处理组,T=0为对照组)", y = "Y值") + theme_minimal() # 可视化对比:密度曲线叠加 ggplot(df, aes(x = Y, color = factor(T), fill = factor(T))) + geom_density(alpha = 0.3) + labs(title = "不同处理组Y值的密度分布", x = "Y值", color = "处理组", fill = "处理组") + theme_minimal() # ---------------------- 第三步:验证处理是否随机分配 ---------------------- # 方法1:连续协变量X的组间差异t检验 t_test_result <- t.test(X ~ T, data = df, na.rm = TRUE) print(t_test_result) # 可视化X在两组的分布 ggplot(df, aes(x = factor(T), y = X)) + geom_boxplot(fill = c("lightblue", "orange")) + labs(title = "不同处理组的X值分布", x = "处理组", y = "X值") + theme_minimal() # 方法2:分类协变量的卡方检验(示例:将X转为三类) df <- df %>% mutate(X_cat = cut(X, breaks = 3, labels = c("低", "中", "高"))) chi_test_result <- chisq.test(table(df$T, df$X_cat)) print(chi_test_result) # 结论:若t检验/卡方检验的p值>0.05,说明两组协变量无显著差异,支持处理是随机分配的
关键修正点
- 数据只读取一次,避免冗余数据框
- 修正众数函数的
na.rm参数逻辑,确保正常生效 - 替换错误的
select写法,改用filter筛选行或正确选择列 - 修复管道操作语法错误,调整
recode逻辑(基于现有T变量创建标签,而非修改Y) - 补充作业要求的可视化图表与随机分配验证的统计方法
内容的提问来源于stack exchange,提问作者tatimaibo
相关产品推荐
相关产品推荐

