【问题标题】:Condition to check values ​between lists and add to new list in R检查列表之间的值并添加到 R 中的新列表的条件
【发布时间】:2020-12-28 15:37:35
【问题描述】:

如果列表ListResiduals(例如:OptionAOptionD)中每个子列表的最后一个值大于ListSigma中对应名称的值(例如:OptionAOptionD),则添加Watchlist 列表的名称(例如:OptionAOptionD)。

在代码的最后一行我放“> 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])))

【问题讨论】:

    标签: r list function


    【解决方案1】:

    我倾向于将您的 Simga 和残差值转换为向量并比较这些向量。您还可以使用 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多