我有一個串列串列(包含字符),我想洗掉這些子串列之間的公共字符。
例如
mylist = list(
list("tata","titi","toto","tete"),
list("fifi","fafa","toto","fefe"),
list("fifi","toto","rere","rara")
)
變成
mylist = list(
list("tata","titi","tete"),
list("fafa","fefe"),
list("rere","rara")
)
我首先創建了一個公共元素串列,并嘗試從子串列中將此串列作為基礎,但它不起作用
common_elements = list(Reduce(intersect, mylist))
mylist = mylist[!(mylist %in% common_elements)]
你可以幫幫我嗎 ?謝謝 !
uj5u.com熱心網友回復:
我們可以使用與上一篇文章類似的解決方案,通過在嵌套串列unnest之后enframe對兩列 tibble 進行兩次 ing 。按'value'分組后filter,'name'中不同元素個數為1的行,然后split按'name'list轉換的( as.list) 'value'列
library(dplyr)
library(tibble)
library(tidyr)
mylist2 <- enframe(mylist) %>%
unnest(value) %>%
unnest(value) %>%
group_by(value) %>%
filter(n_distinct(name) == 1) %>%
with(., split(as.list(value), name)) %>%
unname
-輸出
> str(mylist2)
List of 3
$ :List of 3
..$ : chr "tata"
..$ : chr "titi"
..$ : chr "tete"
$ :List of 2
..$ : chr "fafa"
..$ : chr "fefe"
$ :List of 2
..$ : chr "rere"
..$ : chr "rara"
uj5u.com熱心網友回復:
對于這種情況,串列的元素最好是原子向量,而不是串列本身。例如像這樣:
mylist <- list(
c("tata","titi","toto","tete"),
c("fifi","fafa","toto","fefe"),
c("fifi","toto","rere","rara")
)
您可以通過說類似的內容將原始格式轉換為這種格式mylist_atomic <- lapply(mylist, unlist)。
如果我正確理解您的問題,您希望將串列的每個元素過濾為未出現在 >1 串列元素中的字串。
如果您不關心效率,這里是實作此目的的一種直接方法:
appears_in <- function(mylist, string){
# check how many elements of `mylist` the arg `string` appears in
return(sum(sapply(mylist, function(v) string %in% v)))
}
filter_list <- function(mylist){
result <- vector(mode='list', length=3)
for (idx in seq_along(mylist)){
elem <- mylist[[idx]]
for (string in elem){
if (appears_in(mylist, string) == 1){
result[[idx]] <- c(result[[idx]], string)
}
}
}
return(result)
}
然后你可以這樣呼叫filter_list():
mylist_original <- list(
c("tata","titi","toto","tete"),
c("fifi","fafa","toto","fefe"),
c("fifi","toto","rere","rara")
)
mylist_filtered <- filter_list(mylist_original)
print(mylist_filtered)
# [[1]]
# [1] "tata" "titi" "tete"
#
# [[2]]
# [1] "fafa" "fefe"
#
# [[3]]
# [1] "rere" "rara"
給貓剝皮的方法有很多,這就是其中之一。
uj5u.com熱心網友回復:
只需從您所在的位置繼續:
mylist2 <- lapply(mylist,\(x)x[!x%in% unlist(common_elements)])
dput(mylist2)
list(
list("tata", "titi", "tete"),
list("fifi", "fafa", "fefe"),
list("fifi", "rere", "rara")
)
這正是您要找的
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364178.html
