我想输出路径名列表的子集,条件是列表元素中的字符(文件名中的前缀)。我可以使用for loop
,但我想使用,sapply
因为我猜这是一种更好的方法。
有效for loop
;结果是文件名以 500 或更高开头的路径名列表。Sapply
无效;i
没有按我期望的方式进行迭代,但将元素附加到新列表时可能存在其他问题。
# -----------------------------------------
# add pathnames to files that have a prefix of less than 500,
# to a new list
# -----------------------------------------
# make list
# myList <- list.files(path = "D:/test", pattern = "*.txt")
myList <- list("D:/test/472_a.txt", "D:/test/303_b.txt", "D:/test/500_a.txt", "D:/test/505_b.txt", "D:/test/700_a.txt")
# preallocate subsetted list
myListSubset <- vector("list", length = length(myList))
# -----------------------------------------
# for loop - this works
# -----------------------------------------
for (i in 1:length(myList)) {
print(paste("i is", i))
print(paste(i, "element of myList is", myList[i]))
swath <- str_sub(basename(paste(myList[i], collapse = "")), 1, 3)
# only add swaths ge to 500 to the subsetted list
if (swath >= 500) {
print(paste("swath #", swath))
myListSubset[[i]] <- paste(myList[i], collapse = "")
}
}
# remove Null elements
print(myListSubset)
myListSubset[sapply(myListSubset, is.null)] <- NULL
print(myListSubset)
# -----------------------------------------
# -----------------------------------------
# sapply - this does not work
# -----------------------------------------
i <- 1
sapply(myList, function(s){
swath <- str_sub(basename(s), 1, 3) # swath is the 1st 3 digits in file name
print(paste("swath #", swath))
if (swath >= 500) {
print(paste("list element is", s, "and the class is", class(s)))
print(paste("i is", i, "and the class is", class(i)))
myListSubset[[i]] <- s
i <- (i + 1)
print(paste("i is", i))
}
}
)
# remove Null elements
print(myListSubset)
myListSubset[sapply(myListSubset, is.null)] <- NULL
print(myListSubset)
# -----------------------------------------
像这样?没有循环。
创建于 2024-09-27,使用reprex v2.1.0
基本 R 函数提取向量中满足谓词(逻辑)函数结果为真的元素。我们可以使用正则表达式删除所有非数字元素,然后将结果与进行比较。
Filter()
"\\D+"
500
sapply
在列表上使用然后gsub
在路径上使用来获取数字。输出
您可以使用
keep
+ :parse_number
tidyverse