r - 检查列表之间的值并添加到 R 中的新列表的条件
问题描述
如果列表中每个子列表的最后一个值ListResiduals
(例如:OptionAOptionD)大于(例如:OptionAOptionD)中具有相应名称的值,则将ListSigma
名称(例如:OptionAOptionD)添加到Watchlist
列表中。
在代码的最后一行中,我将“ > 5 ”用于示例工作,这是我要在上一段中提到的条件下替换的“ > 5 ”。
DF <- data.frame("OptionA" = sample(1:100, 50),
"OptionB" = sample(1:100, 50),
"OptionC" = sample(1:100, 50),
"OptionD" = sample(1:100, 50))
#Unfolding options and creating DF
UnFolding <- data.frame(
First = as.vector(sapply(names(DF[]), function(x)
sapply(names(DF[]), function(y)
paste0(x)))),
Second = as.vector(sapply(names(DF[]), function(x)
sapply(names(DF[]), function(y)
paste0(y)))))
#Deleting lines with the same names
UnFolding <-
UnFolding[UnFolding$First != UnFolding$Second, ]
#Creating list with dependent and independent variables
LMList <- apply(UnFolding, 1, function(x)
as.formula(paste(x[1], "~", x[2])))
#Change list data to variable names
names(LMList) <- substring(lapply(LMList, paste, collapse = ""), 2)
#Linear regression - lm()
LMListRegression <- lapply(LMList, function(x) {
eval(call("lm", formula = x, data = DF))
})
#Residuals
ListResiduals <- lapply(LMListRegression, residuals)
#Sigma
ListSigma <- lapply(LMListRegression, function(x) {
sigma(x)*2
})
#Watchlist
Watchlist <- as.list(unlist(lapply(ListResiduals,
function(x) names(x)[1][tail(x, 1) > 5])))
解决方案
我倾向于将您的 Simga 和 Residual 值转换为向量并比较向量。您还可以使用 data.frame 方法来确保列表/向量的顺序不会改变。
# create a vector with the last value from the Residuals list.
last_residual <- sapply(ListResiduals, `[`, 50)
names(last_residual) <- substr(names(last_residual), 1, stop = -4)
# Using sapply() rather than lapply, will return a named vector
sigma_vector <- sapply(LMListRegression, function(x) {
sigma(x)*2
})
Watchlist <- sigma_vector[last_residual > sigma_vector]
Watchlist
# named numeric(0)
In your example, it returns an empty named vector because no values meet your condition
max(last_residual)
# [1] 31.70949
min(sigma_vector)
# [1] 52.93234
# To demonstrate that it works, let's devide sigma by 2 so that at least some values will pass
half_sigma <- sigma_vector/2
Watchlist2 <- sigma_vector[last_residual > half_sigma]
Watchlist2
# OptionDOptionA OptionDOptionB OptionDOptionC
# 54.52411 57.09503 56.79341
推荐阅读
- angular - 使用 Angular 2-4 编写 Jasmine 测试用例时 first 不是函数
- html - 页面内导航或网站导航?
- mysql - 我可以这样在MySQL中使用问号吗
- sql - 带有整数和字符串的 Django Concat 列
- sql-server - 如何将所有模式从一个数据库复制到另一个数据库(在运行时创建)?
- javascript - 使用 map 和 redux 时子道具触发重新渲染
- java - Oracle查询未返回正确数量的结果
- forms - Bootstrap 4 & Phpmailer 表单上传文件
- matlab - 当变量矩阵中存在常数时,在MATLAB上求解方程组?
- python - 基于熊猫数据框中的值的彩色编码表格图