Как сделать условное слияние по списку списков в R? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть список.
Я хочу сравнить элементы попарно, а затем объединить элементы, если они соответствуют критериям
Пример списка:

[[1]]
[1] "466" "1758" "975"

[[2]]
[1] "1528" "185"  "975" 

[[3]]
[1] "1528" "185"  "975" 

[[4]]
[1] "2892" "758"  "971" 

[[5]]
[1] "1321" "274"  "969" 

[[6]]
[1] "1321"  "274" "969" 

[[7]]
[1] "115"  "1321" "969" 

[[8]]
[1] "1321" "441"  "969" 

[[9]]
[1] "504" "61"  "948"

[[10]]
[1] "504"  "61" "948" 

Предположим, что критерии просты: если элемент 1 равен элементу 2 затем объедините их и удалите второй элемент из списка.

Ожидаемый результат:

[[1]]
[1] "466" "1758" "975"

[[2]]
[1] "1528" "185"  "975" "1528" "185"  "975" 

[[3]]
[1] "2892" "758"  "971" 

[[4]]
[1] "1321" "274"  "969" "1321"  "274" "969" 

[[5]]
[1] "115"  "1321" "969" 

[[6]]
[1] "1321" "441"  "969" 

[[7]]
[1] "504" "61"  "948" "504"  "61" "948" 

Спасибо

1 Ответ

3 голосов
/ 02 мая 2020

Мы могли бы создать логический индекс с duplicated, извлечь элементы из list и объединить с помощью Map, обновить list и извлечь только те элементы на основе индекса

i1 <- duplicated(lst1)
i2 <- duplicated(lst1, fromLast = TRUE)
lst2 <- lst1
lst2[i1] <- Map(c, lst1[i1], lst1[i2])
lst2[!i2]
#[[1]]
#[1] "466"  "1758" "975" 

#[[2]]
#[1] "1528" "185"  "975"  "1528" "185"  "975" 

#[[3]]
[#1] "2892" "758"  "971" 

#[[4]]
#[1] "1321" "274"  "969"  "1321" "274"  "969" 

#[[5]]
#[1] "115"  "1321" "969" 

#[[6]]
#[1] "1321" "441"  "969" 

#[[7]]
#[1] "504" "61"  "948" "504" "61"  "948"

или с использованием split

lst2[i1] <- lapply(split(lst1[i1|i2], lst1[i1|i2], drop = TRUE), unlist)

data

lst1 <- list(c("466", "1758", "975"), c("1528", "185", "975"), c("1528", 
"185", "975"), c("2892", "758", "971"), c("1321", "274", "969"
), c("1321", "274", "969"), c("115", "1321", "969"), c("1321", 
"441", "969"), c("504", "61", "948"), c("504", "61", "948"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...