2017-01-12 10 views
2

У меня есть список, который выглядит примерно так:Как удалить элементы из списка векторов символов?

what_i_have <- list(A = LETTERS[1:6], B = LETTERS[1:6], C = LETTERS[2:7]) 

Я хочу, чтобы удалить элементы из каждого вектора в соответствии с именем этого элемента списка, так что я в конечном итоге с этим:

what_i_want <- list(A = LETTERS[2:6], B = LETTERS[c(1, 3:6)], C = LETTERS[c(2,4:7)]) 

Что манипуляции я могу сделать до i_have_this, чтобы добраться до i_want_this?

У меня есть до получения списка логических векторов в той же структуре, используя purrr::map2(what_i_have, names(what_i_have), function(x, y) x == y), но мой мозг перегружен, пытаясь подмножество what_i_have.

Что мне не хватает? Вы можете помочь?

Бонусные баллы для решений tidyverse (или базового R).

library(testthat) 
test_that("Turn what I have into what I want", { 
    expect_equal(what_i_have, what_i_want) 
}) 

Благодарим за помощь.

ответ

1

Просто используйте x[x != y], это удалит элементы, которые равны имена из x:

what_i_get <- purrr::map2(what_i_have, names(what_i_have), function(x, y) x[x != y]) 
identical(what_i_get, what_i_want) 
# [1] TRUE 

В базовой R можно использовать Map:

Map(function(x, y) x[x != y], what_i_have, names(what_i_have)) 
+1

Спасибо, я знал, что это глупый вопрос, но мой мозг был перегружен! – mnfn

+1

или 'map2 (what_i_have, имена (what_i_have), ~ .x [.x! = .y])' – hrbrmstr

2

Просто

Map(setdiff, have, names(have)) 
+1

Большое спасибо – mnfn

 Смежные вопросы

  • Нет связанных вопросов^_^