如何使用 sapply 根据列表元素详细信息对列表进行子集化?

问题描述 投票:0回答:1

我想输出路径名列表的子集,以列表元素中的字符(文件名中的前缀)为条件。我可以使用

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



r
1个回答
0
投票

像这样?没有循环。

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

i <- myList |>
  unlist() |>
  basename() |>
  grepl("^[5-9]", x = _)

myList[i]
#> [[1]]
#> [1] "D:/test/500_a.txt"
#> 
#> [[2]]
#> [1] "D:/test/505_b.txt"
#> 
#> [[3]]
#> [1] "D:/test/700_a.txt"

创建于 2024-09-27,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.