Удаление определенного элемента из списка векторов в R - PullRequest
1 голос
/ 08 апреля 2019

Предположим, у меня есть список индексов и значений.

indx_list <- list(1,2,c(3,4),5,c(6,7,8))
val_list <- list(0.1,0.6,c(0.8,0.9),0.3,c(0.4,0.8,0.5))

Затем я хочу обновить оба списка, удалив индексы c(4,7) и соответствующие значения c(0.9,0.5). Это довольно легко сделать, используя lapply и setdiff. Например:

indx_list_new <- lapply(indx_list,function(x) setdiff(x,c(4,7)))
val_list_new <- lapply(val_list,function(x) setdiff(x,c(0.9,0.5)))

Однако я заранее не знаю, какие индексы и соответствующие значения я буду удалять.

set.seed(1234)
indx_flag <- sample(seq(8),2)

Вы также можете видеть, что некоторые значения повторяются (например, 0,8), поэтому использование setdiff может фактически удалить значения в неправильной позиции.

Вопросы

1) Я все еще могу использовать lapply и setdiff для обновления indx_list, но как я могу обновить значения в val_list?

2) Является ли lapply наиболее эффективным решением здесь? У меня будут списки с тысячами элементов, и каждый элемент может быть вектором сотен индексов / значений.

Редактировать

Каждый элемент в списке (самый высокий уровень) на самом деле имеет определенное значение, поэтому я хотел бы сохранить структуру списка.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Вместо этого упорядочьте данные в «аккуратное» представление

df = data.frame(
    indx = unlist(indx_list),
    val = unlist(val_list),
    grp = factor(rep(seq_along(indx_list), lengths(indx_list)))
)

, где операция более или менее прозрачна

base::subset(df, !indx %in% c(4, 7))
  indx val grp
1    1 0.1   1
2    2 0.6   2
3    3 0.8   3
5    5 0.3   4
6    6 0.4   5
8    8 0.5   5

Использование subset() аналогично df[!df$indx %in% c(4, 7), , drop = FALSE].(Я использовал factor() для учета пустых групп, то есть уровней без соответствующих значений).

1 голос
/ 08 апреля 2019

Вот попытка использования relist и Map для удаления одинаковых точек:

Map(`[`, val_list, relist(!unlist(indx_list) %in% c(4,7), indx_list))
#[[1]]
#[1] 0.1
#
#[[2]]
#[1] 0.6
#
#[[3]]
#[1] 0.8
# 
#[[4]]
#[1] 0.3
#
#[[5]]
#[1] 0.4 0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...