2017-04-08 65 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'完成任何您想要的操作。我已經更新了我的答案,以說明原則。 –