2017-04-08 43 views
1

我的无名一个list,逗号分隔字符列表:操纵字符列表的列表中的R

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

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

实际列表很长,并且在其内部的每个字符列表是随机长度的并含有不同的,不可预测,字符组合。我需要三样东西应用到所有的角色列表中的每个元素:

  • 有条件删除元素,说所有这些等于“A”
  • 有条件更换元素,说所有的那些平等“A”与“B”
  • 如果任何元素包含“/”,例如一个元素等于“A/BCD”,然后删除“/”右侧的所有内容,包括“/”本身,以便在该特定情况下以“A”结尾。

我是R的新手,猜测这是一件小事。如果有人愿意帮助我,我会很开心!欢呼声:)

回答

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将确保将这些不同的元素组合回列表中。

+0

非常感谢!只需快速跟进,是否有办法一次纳入更多条件?例如,用“F”替换包括“B”,“C”等的所有内容。我有很多条件,并且很乐意避免复制那条线!谢谢:) – CHRD

+0

@CHRD显然。你只需要相应地调整功能。如果您想检查矢量中的多个项目,请检查'?match'或'%in%'。在函数调用中,您可以使用表示元素的矢量'x'完成任何您想要的操作。我已经更新了我的答案,以说明原则。 –