R语言中执行t.test时出现‘invalid type (list) for variable’报错及数据处理问题求助
解决你的R语言t检验错误及数据处理问题
我来帮你一步步拆解和解决遇到的问题:
一、先处理Reprex里的前置错误
你在数据处理阶段遇到的几个错误,根源很明确:
object 'global' not found:你还没有创建或导入名为global的数据框,R找不到这个对象。你需要先把原始数据导入R(比如用read.csv()),或者像我下面示例里那样模拟一份测试数据。no applicable method for 'tbl_vars' applied to an object of class "function":local是R的内置函数(用来创建局部环境),不能用它作为你的数据框名称!把数据框改名成local_df这类不会冲突的名字就好。
二、核心问题:t检验的用法错误
你运行t.test(meansharelocal ~ meanshareglobal)时收到的invalid type (list) for variable 'meansharelocal'错误,原因是:
meansharelocal和meanshareglobal是用summarise()得到的数据框(本质是list类型),而t.test()的公式语法(y ~ x)要求x是分组变量,y是数值向量,你不能直接把两个数据框丢进去。- 另外,你的实验设计是两组(global和local)各有4个均值,正确的做法是把这两组均值转换成数值向量,再传入
t.test()。
三、完整的修正代码示例
我会用模拟数据演示整个流程,你可以替换成自己的真实数据:
1. 准备数据(模拟或导入)
library(dplyr) # 模拟global数据框(替换成你自己的read.csv("your_global_data.csv")) global <- tibble( Share_1 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_2 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_3 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_4 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE) ) # 把local改成local_df,避免和内置函数冲突 local_df <- tibble( Share_1 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_2 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_3 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE), Share_4 = sample(c("Extremely likely", "Somewhat likely", "Neither likely nor unlikely", "Somewhat unlikely", "Extremely unlikely"), 10, replace = TRUE) )
2. 重新编码分类变量为数值
用across()替代旧的mutate_at(dplyr 1.0.0版本后推荐用法):
globalshare <- global %>% mutate(across(c(Share_1, Share_2, Share_3, Share_4), ~recode(., "Extremely likely" = 4, "Somewhat likely" = 3, "Neither likely nor unlikely" = 2, "Somewhat unlikely" = 1, "Extremely unlikely" = 0))) localshare <- local_df %>% mutate(across(c(Share_1, Share_2, Share_3, Share_4), ~recode(., "Extremely likely" = 4, "Somewhat likely" = 3, "Neither likely nor unlikely" = 2, "Somewhat unlikely" = 1, "Extremely unlikely" = 0)))
3. 计算均值并转换为数值向量
# 提取均值并转成数值向量,而不是保留数据框格式 meanshareglobal <- as.numeric(globalshare %>% summarise(mean(Share_1), mean(Share_2), mean(Share_3), mean(Share_4))) meansharelocal <- as.numeric(localshare %>% summarise(mean(Share_1), mean(Share_2), mean(Share_3), mean(Share_4)))
4. 执行t检验
根据你的实验设计选择合适的检验方式:
- 独立样本t检验(假设4个均值是独立观测):
t.test(meanshareglobal, meansharelocal) - 配对t检验(如果Share_1到Share_4是对应的类别,比如四个相关问题,适合配对比较):
t.test(meanshareglobal, meansharelocal, paired = TRUE)
四、额外提示
如果你想直接用原始的Share变量做检验(而不是先算均值),可以把数据转成长格式后再用公式语法,比如:
# 把global和local数据合并并标记分组 combined_data <- bind_rows( globalshare %>% pivot_longer(cols = everything(), names_to = "Share", values_to = "Score") %>% mutate(Group = "Global"), localshare %>% pivot_longer(cols = everything(), names_to = "Share", values_to = "Score") %>% mutate(Group = "Local") ) # 用公式语法做t检验 t.test(Score ~ Group, data = combined_data)
内容的提问来源于stack exchange,提问作者Lucia Lucia
相关产品推荐
相关产品推荐

