【问题标题】:Manipulate list of character lists in R操作R中的字符列表列表
【发布时间】:2017-09-03 16:43:24
【问题描述】:

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

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

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

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

  • 有条件地删除元素,比如所有等于“A”的元素
  • 有条件地替换元素,比如所有将“A”替换为“B”的元素
  • 如果任何元素包含“/”,例如一个等于“A/BCD”的元素,然后删除“/”右侧的所有内容,包括“/”本身,以便在这种特殊情况下以“A”结尾。

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

【问题讨论】:

    标签: r list function conditional lapply


    【解决方案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 将确保将这些不同的元素组合回一个列表。

    【讨论】:

    • 非常感谢!只是快速跟进,有没有办法一次包含更多条件?例如,用“F”替换包括“B”、“C”等的所有内容。我有很多条件,并且希望避免一遍又一遍地复制该行!谢谢:)
    • @CHRD 显然。您只需要相应地调整功能。如果要检查向量中的多个项目,请检查?match%in%。在函数调用中,您可以使用代表元素的向量x 做任何您想做的事情。我已经更新了我的答案以显示其原理。
    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多