具有关系运算符的列表中的子集

时间:2017-07-18 08:30:17

标签: r list subset

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

loopdone "wget -c http://my.url/"

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

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")))

Shaun Wilkinson提出的解决方案很有效。

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

我还提出了另一种解决方案,它在for循环中包含一个条件语句。

# 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]

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

除了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
  }
}