r - 如何将数字向量放入函数而不是R中的字符?
问题描述
假设我有一个数据框:
gr <- c(0,0,1,0,1,1)
x <- c(10, 11, 12, 13, 14, 15)
y <- c(20, 21, 22, 23, 24, 25)
z <- c(30, 31, 32, 33, 34, 35)
data <- data.frame(gr, x, y, z)
我想t.test
在我的数据框中执行所有变量。为此,我编写了一个函数
t_test <- function(var){
p <- t.test(var ~ gr)$p.value
t <- t.test(var ~ gr)$statistic
if (p < 0.05) {
des <- 'good'
} else { des <- 'bad'}
out <- list(p, t, des)
return(out)
}
然后我想表演t.test
。
我发现如果我将列名放入函数中,则该函数不起作用。例如
t_test('x')
在这种情况下会发生错误。但是当我运行以下代码时
t_test(x)
即没有引号一切正常。
如何解决这个问题?这非常重要,因为我有一个包含 80 列的数据框,我需要像这样循环执行此测试:
data_colnames <- names(data)[2:ncol(data)]
t_test_data <- data.frame(matrix(ncol = 4, nrow = 0))
names(t_test_data) <- c("variable", "t_stat", "p_value", "decision")
for (i in 1:length(data_colnames)){
t_test_data[i, 'variable'] <- data_colnames[i]
t_test_data[i, 't_stat'] <- t_test(data_colnames[i])[2]
}
解决方案
我们可以使用paste
或reformulate
从字符串输入创建公式。在 OP 的代码中,构建了两次模型以访问“p.value”和“statistic”。相反,构建模型一次并通过将其分配给对象('tmodel')来提取组件
t_test <- function(var){
tmodel <- t.test(reformulate("gr", response = var))
p <- tmodel$p.value
t <- tmodel$statistic
if (p < 0.05) {
des <- 'good'
} else { des <- 'bad'}
out <- list(t, p, des)
return(out)
}
-测试
> t_test("x")
[[1]]
t
-1.870829
[[2]]
[1] 0.1347019
[[3]]
[1] "bad"
对于多种情况,请执行
> sapply(data_colnames, \(x) setNames(t_test(x), names(t_test_data)[-1]))
x y z
t_stat -1.870829 -1.870829 0.1492787
p_value 0.1347019 0.1347019 0.8931025
decision "bad" "bad" "bad"
或使用 OP 的for
循环
for (i in seq_along(data_colnames)){
t_test_data[i, 'variable'] <- data_colnames[i]
t_test_data[i, -1] <- t_test(data_colnames[i])
}
-输出
> t_test_data
variable t_stat p_value decision
1 x -1.8708287 0.1347019 bad
2 y -1.8708287 0.1347019 bad
3 z 0.1492787 0.8931025 bad
推荐阅读
- wordpress - 在 WooCommerce 中排除计算税的产品
- logstash - Logstash Grok 过滤器逗号 sep。细绳
- c# - 如何使用 Moq 设置数组元素?
- python - 为什么将列的值除以其他列在熊猫中创建数组?(我希望得到单个值)
- java - 打印机功能JavaFX的问题
- android - 我如何确定适合整个屏幕的字符数,我得到正确的屏幕宽度但字符宽度似乎关闭
- javascript - Javascript:将输入放在两个变量之间并输出
- java - 在 JavaFX 中使用 ComboBox 进行多选和取消选择
- haskell - 将存在主义提升到类型级别
- mysql - MYSQL 嵌套查询到 Laravel Eloquent ORM