【问题标题】:Subset from a list with relational operators具有关系运算符的列表的子集
【发布时间】:2017-07-18 08:30:16
【问题描述】:

我有一个列表对象,其中包含多个列表,每个列表中都有相同的返回对象。下面的列表是这个的简短版本。

logs <- list(list(success = TRUE, details = "check", timestamp = as.Date("2017-10-06")),
         list(success = FALSE, details = "uncheck", timestamp = as.Date("2017-10-07")),
         list(success = FALSE, details = "check", timestamp = as.Date("2017-10-08")),
         list(success = FALSE, details = "uncheck", timestamp = as.Date("2017-10-09")))

我想创建两个向量:如果第一个元素的内容等于 true,则一个向量 (success_true) 包含每个列表的第二个元素的内容,另一个向量 (succes_false) 包含第二个元素的内容如果第一个元素的内容等于 false,则为每个列表。我正在寻找的结果如下所示:

success_true <- c("check")
succes_false <- c("uncheck", "check", "uncheck") 

Shaun Wilkinson 提出的巧妙解决方案奏效了。

# Solution number 1 by Shaun Wilkinson: sapply
successes <- sapply(logs, function(e) e$success)
details <- sapply(logs, function(e) e$details)
success_true <- details[successes]
success_false <- details[!successes]

我还提出了另一种解决方案,在 for 循环中加入条件语句。

# Solution number 2 by SHW: conditional statement with for loop
success_true <- c() #create two vectors
success_false <- c()

for (log in logs) { 
  if (log$success == TRUE) {
    success_true <- c(success_true, log$details) #add content of details element to the success_true vector if the condition is met
  } else {
    success_false <- c(succes_false, log$details) #add content of details element to the success_false vector if the condition is met
  }

【问题讨论】:

    标签: r list subset


    【解决方案1】:

    试试这个:

    successes <- sapply(logs, function(e) e$success)
    details <- sapply(logs, function(e) e$details)
    success_true <- details[successes]
    success_false <- details[!successes]
    

    【讨论】:

    • 此解决方案有效。您能否详细说明一下您在代码中所做的工作?
    • 当然,这可能不是最优雅的解决方案,但前两行只是从嵌套列表中提取 'success' 和 'details' 元素,并将它们强制转换为逻辑向量和字符向量, 分别。第二部分只是“详细信息”向量的逻辑子集。
    【解决方案2】:

    除了 Shauns 的回答之外,我还发现了另一种解决方案,它在 for 循环中加入了条件语句。我认为此解决方案具有更大的灵活性,因此是我将使用的解决方案。

    success_true <- c() #create two vectors
    success_false <- c()
    
    for (log in logs) { 
      if (log$success == TRUE) {
        success_true <- c(success_true, log$details) #add content of details element to the success_true vector if the condition is met
      } else {
        success_false <- c(succes_false, log$details) #add content of details element to the success_false vector if the condition is met
      }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2018-11-30
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多