我确信我的解决方案(请参阅“期望的结果”)极大地使问题复杂化了。我有两个向量-向量1表示开始,向量2表示度量的结束。不适用,未记录任何更改。
我要检查是否有奇怪的数据条目-即,某些内容尚未开始。我只想要看似合理的数据条目。一个小节可以在下一个小节开始时同时结束(例如,请参见示例中的小节“ C”)。
我的方法: 我使用cumsum为起始向量中的每个新非缺失元素创建剪切,并为每个剪切检查是否有多个“结束”条目,并在有非NA条目时删除NA。 这个想法是获得一个具有唯一最终值或NA的向量,我可以将其与起始向量的唯一元素进行比较。所得的逻辑向量用于子集起始列表。
其他可能相关的信息: 这两个向量实际上是数据帧的列。欢迎任何包裹。
此外,如果您有更好的标题建议,我也很乐意听。干杯。
start_r <- c("A", NA, NA, "B", NA, NA, "C", NA, NA, "D", NA, "D")
end_r <- c(NA, "A", NA, NA, "B", "C", NA, NA, NA, "C", NA, NA)
## as suggested by Henrik, here as data frame.
## "B" has two following entries in column "end_r" and is therefore not plausible
data.frame(start_r, end_r)
#> start_r end_r
#> 1 A <NA>
#> 2 <NA> A
#> 3 <NA> <NA>
#> 4 B <NA>
#> 5 <NA> B
#> 6 <NA> C
#> 7 C <NA>
#> 8 <NA> <NA>
#> 9 <NA> <NA>
#> 10 D C
#> 11 <NA> <NA>
#> 12 D <NA>
end_lag <- dplyr::lead(end_r)
cs1 <- cumsum(!is.na(start_r))
ls_start <- split(start_r, cs1)
ls_end_lagged <- split(end_lag, cs1)
ls_end_nona <- lapply(ls_end_lagged,
function(x) if(all(is.na(unique(x)))) NA
else if (length(unique(x[!is.na(x)])) >1) NA
else x[!is.na(x)]
)
v_start <- sapply(split(start_r, cs1), function(x) x[!is.na(x)])
v2 <- sapply(ls_end_nona, function(x) x[1])
## desired result
data.frame(start_r = unname(unlist(ls_start[v_start %in% v2])))
#> start_r
#> 1 A
#> 2 <NA>
#> 3 <NA>
#> 4 C
#> 5 <NA>
#> 6 <NA>
答案 0 :(得分:1)
'v1'也可以使用
创建library(dplyr)
v2 <- stack(ls_end_lagged) %>%
group_by(ind) %>%
summarise(values =
if(all(is.na(values))| n_distinct(na.omit(values)) > 1 ) NA else
first(na.omit(values)) ) %>%
pull(values)
对于其他情况
unlist(ls_start[v1 %in% v2], use.names = FALSE)
#[1] "A" NA NA "C" NA NA
-检查输出
tidyverse
或者另一种选择是使用library(dplyr)
library(tibble)
tibble(start = start_r, end = lead(end_r)) %>%
group_by(grp = cumsum(!is.na(start))) %>%
summarise(across(everything(), ~
if(all(is.na(.)) | n_distinct(na.omit(.)) > 1) NA_character_
else first(na.omit(.))), .groups = 'drop') %>%
select(-grp)
const Discord = require('discord.js');
const fs = require('fs');
module.exports = {
name: 'createfile',
description: "The bot will create a .json file named after the argument",
execute(message, args){
var fileName = args[0]
if(!args) {
return message.reply('invalid name')
};
let jsonFile = {
fileName: fileName
};
let data = JSON.stringify(jsonFile);
fs.writeFileSync(`${fileName}.json`, data);
}
}