首页 > 解决方案 > 检查列表之间的值并添加到 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])))

标签: rlistfunction

解决方案


我倾向于将您的 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 

推荐阅读