我有一个不同长度的字符向量列表,包含标识符(例如"011"或"12",表示金额的数字("112.3";或"490.5")和年份("2011"或"2020",空元素(")和只包含一个点的元素(".")。我想摆脱字符向量的元素,只包含一个点或为空。标识符的前导零很重要,因此不能将类型更改为数字。
原始数据
l <- list(c("2015","2016"),c(""),c("."), c("0","2418.9","292.4"),c("2",".",".","2394.6"),c("011","","934.0","1200.7"))
应该像这样:
l_final <- list(c("2015","2016"),c("0","2418.9","292.4"),c("2","2394.6"),c("011","934.0","1200.7"))
我的想法是创建一个带有TRUE/FALSE的列表,指示每个向量要保留哪些元素,但现在我真的被卡住了,因为下面的方法不起作用(它返回零整数):
test <- lapply(list, function(i) {unlist(lapply(list[i], function(b) which(b==".")))})
关于"."的表达式,我已经尝试了其他正则表达式,如"."one_answers"[]"。
我们可以遍历list
,将非.
或""
和Filter
元素的子集从列表中的空元素
Filter(length, lapply(list, function(x) x[! x %in% c(".", "")]))
与产出
[[1]]
[1] "2015" "2016"
[[2]]
[1] "0" "2418.9" "292.4"
[[3]]
[1] "2" "2394.6"
两步解决方案,如果需要的话,将lapply
加倍作为替代方案:
# data
l <- list(c("2015","2016"),c(""),c("."), c("0","2418.9","292.4"),c("2",".",".","2394.6"))
# remove those with "." or ""
l2 <- lapply(l, function(x) {x[!(x %in% c(".", ""))]})
# remove empty list positions
l2[lapply(l2, length) > 0]
#[[1]]
#[1] "2015" "2016"
#[[2]]
#[1] "0" "2418.9" "292.4"
#[[3]]
#[1] "2" "2394.6"