【发布时间】: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
}
【问题讨论】: