Подмножество и замена данных в именованном списке элементов: как получить индекс, подмножество и сохранить формат и структуру списка? - PullRequest
0 голосов
/ 26 февраля 2019

Я гораздо лучше знаком с векторами, data.frames и тому подобным, но согласен, что использовать список удобно, когда функция имеет несколько выходов.

Функция из пакета, который я использую, получает именованный список изtibbles (не очень знакомы с tibbles), ни список.

    List of 68
 $ 292684 :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    5 obs. of  3 variables:
  ..$ name: chr [1:5] "Animalia" "Arthropoda" "Chelicerata" "Arachnida" ...
  ..$ rank: chr [1:5] "Kingdom" "Phylum" "Subphylum" "Class" ...
  ..$ id  : int [1:5] 2 1065 1274 1300 292684
 $ 126752 :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    10 obs. of  3 variables:
  ..$ name: chr [1:10] "Animalia" "Chordata" "Vertebrata" "Gnathostomata" ...
  ..$ rank: chr [1:10] "Kingdom" "Phylum" "Subphylum" "Superclass" ...
  ..$ id  : int [1:10] 2 1821 146419 1828 10194 11014 151729 125516 125909 126752

Мой вопрос как эффективно перемещаться по этому списку, подмножеству в соответствии с логическим условием, возможно, заменить некоторые значения при сохранении формата списка?

Я пробовал unlist () / relist (), но он не сохраняет структуру.Я пробовал вложенный sapply sapply (sapply (mylist, "[", 2), function (x) и т. Д.), А затем применил мое условие к выходным данным, чтобы определить позицию и использовать eval (parse (paste ...) для достиженияправильный уровень в списке, но довольно сложно ...

 aa <- sapply(sapply(list.classif, "[", 2), length)
 who.max <- which(aa==max(aa))
 pos.list <- which(aa==max(aa))
 index <- names(who.max)
 best.classif <- eval(parse(text=paste("list.classif[pos.list]$`",index, 
 "`$rank", sep="") ))

Если мне удалось таким образом подгруппировать данные ... Это кажется слишком сложным, и я уверен, что есть лучшее решение?

Кроме того, что если я захочу заменить данные в этом конкретном месте? Вы не можете сделать классический объект, не так ли?

object[index, index] <- replacebythat

Возможнооперации могут быть:

  • , чтобы изменить "Chordata" на ... "Что угодно",
  • изменить "Класс" на ... "Что-то"
  • Определитьу каких организмов есть "Subphylum" "Crustacea" (т. е. $ name == Crustacea)
  • В зависимости от выбора выше измените информацию.

ОБРАЗЕЦ ДАННЫХс dput ()

    structure(list(`292684` = structure(list(name = c("Animalia", 
"Arthropoda", "Chelicerata", "Arachnida", "Acari"), rank = c("Kingdom", 
"Phylum", "Subphylum", "Class", "Subclass"), id = c(2L, 1065L, 
1274L, 1300L, 292684L)), .Names = c("name", "rank", "id"), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame")), `126752` = structure(list(
    name = c("Animalia", "Chordata", "Vertebrata", "Gnathostomata", 
    "Pisces", "Actinopterygii", "Perciformes", "Trachinoidei", 
    "Ammodytidae", "Ammodytes", "Ammodytes tobianus"), rank = c("Kingdom", 
    "Phylum", "Subphylum", "Superclass", "Superclass", "Class", 
    "Order", "Suborder", "Family", "Genus", "Species"), id = c(2L, 
    1821L, 146419L, 1828L, 11676L, 10194L, 11014L, 151729L, 125516L, 
    125909L, 126752L)), .Names = c("name", "rank", "id"), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame")), `421139` = structure(list(
    name = c("Animalia", "Arthropoda", "Crustacea", "Multicrustacea", 
    "Hexanauplia", "Thecostraca", "Cirripedia", "Thoracica", 
    "Sessilia", "Balanomorpha", "Balanoidea", "Balanidae", "Amphibalaninae", 
    "Amphibalanus", "Amphibalanus improvisus"), rank = c("Kingdom", 
    "Phylum", "Subphylum", "Superclass", "Class", "Subclass", 
    "Infraclass", "Superorder", "Order", "Suborder", "Superfamily", 
    "Family", "Subfamily", "Genus", "Species"), id = c(2L, 1065L, 
    1066L, 845959L, 889925L, 22388L, 1082L, 1107L, 106033L, 106039L, 
    106041L, 106057L, 394026L, 415046L, 421139L)), .Names = c("name", 
"rank", "id"), row.names = c(NA, -15L), class = c("tbl_df", "tbl", 
"data.frame")), `1135` = structure(list(name = c("Animalia", 
"Arthropoda", "Crustacea", "Multicrustacea", "Malacostraca", 
"Eumalacostraca", "Peracarida", "Amphipoda"), rank = c("Kingdom", 
"Phylum", "Subphylum", "Superclass", "Class", "Subclass", "Superorder", 
"Order"), id = c(2L, 1065L, 1066L, 845959L, 1071L, 1086L, 1090L, 
1135L)), .Names = c("name", "rank", "id"), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame")), `103068` = structure(list(
    name = c("Animalia", "Arthropoda", "Crustacea", "Multicrustacea", 
    "Malacostraca", "Eumalacostraca", "Peracarida", "Amphipoda", 
    "Senticaudata", "Gammarida", "Gammaridira", "Gammaroidea", 
    "Bathyporeiidae", "Bathyporeia", "Bathyporeia pilosa"), rank = c("Kingdom", 
    "Phylum", "Subphylum", "Superclass", "Class", "Subclass", 
    "Superorder", "Order", "Suborder", "Infraorder", "Parvorder", 
    "Superfamily", "Family", "Genus", "Species"), id = c(2L, 
    1065L, 1066L, 845959L, 1071L, 1086L, 1090L, 1135L, 719424L, 
    236816L, 720166L, 720708L, 533675L, 101742L, 103068L)), .Names = c("name", 
"rank", "id"), row.names = c(NA, -15L), class = c("tbl_df", "tbl", 
"data.frame"))), .Names = c("292684", "126752", "421139", "1135", 
"103068"))

1 Ответ

0 голосов
/ 26 февраля 2019

Ответьте за - чтобы заменить "Chordata" на ... "Безотносительно":

library(tidyverse)

lot %>%
  map(~ .x %>% mutate(name = if_else(name == 'Chordata', 'Whatever', name)))

Ответьте за - Определите, у каких организмов есть "Subphylum" "Crustacea" (так что $ name == Crustacea):

lot %>%
  map(~ .x %>% filter(
    name == 'Crustacea'
  ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...