操纵R中的字符列表列表

时间:2017-04-08 10:05:28

标签: r list function conditional lapply

我有一个list未命名的逗号分隔字符列表:

> list
[[1]]
[1] "A" "B" "C" "D"

[[2]]
[1] "E" "F" "G"

实际列表很长,其中的每个字符列表都是随机长度,包含不同的,不可预测的字符组合。我需要对所有字符列表的每个元素应用三个内容:

  • 有条件删除元素,比如所有那些等于" A"
  • 有条件地替换元素,比如所有那些等于" A"与" B"
  • 如果任何元素包含" /",例如一个等于" A / BCD"的元素,然后删除" /"右边的所有内容,包括" /"本身,所以我最终得到了" A"在那个特例中。

我是R的新手并且猜测这是一项微不足道的任务。如果有人愿意帮助我,我会很高兴!干杯:)

1 个答案:

答案 0 :(得分:1)

要对列表执行任何操作,您可以使用apply系列对其进行循环。使用lapply可以获得列表,这就是您想要的。 lapply将列表作为第一个参数,然后是您想要的任何类型的函数。

所以,让我们从:

开始
mylist <- list(
  LETTERS[1:4],
  LETTERS[5:7],
  c("A/BCD","H","J")
)

删除列表中每个元素的"A"如下:

lapply(mylist, function(x) x[x!="A"])

替换元素会是这样的:

lapply(mylist, function(x) {
  id <- x == "B"
  x[id] <- "F"
  return(x)
})

可以使用gsub像这样编辑每个元素中的值:

lapply(mylist, function(x){
  gsub("/.+","",x)
})

您可以将所有内容组合在一个函数中,然后将该函数应用于列表。您不必在lapply调用中将其创建为匿名函数,您可以预先定义它,然后像这样使用它:

cleanup <- function(x){
  x <- gsub("/.+","",x) # remove extra info
  id <- x %in% c("A","H")
  x[id] <- "F"
  return(x)
}

lapply(mylist, cleanup)

原则总是一样的:每次我创建一个匿名函数,它将一个向量作为输入并返回适应的向量作为输出。 lapply将确保将这些不同的元素组合回列表中。