Создание имен для списка двойников в «Список именованных векторов» - PullRequest
0 голосов
/ 17 декабря 2018

Что я пытаюсь сделать:

В пакете тля есть функция diverveHMM () , которую необходимо заполнить списком, подобным:

x <- list(c("c"="10.0", "b"="5.0","c"="10.0", "a"="1.0", "a"="2.0",...))

, который должен быть создан из очень большого входного вектора, такого как

iv <- c(10, 5, 10, 1, 2,...)

Важно, чтобы порядок моего исходного входного вектора оставался неизменным.

Мне нужно автоматически создать этот список при большом вводе парных чисел из CSV-файла (импорт парных значений в R работал нормально).Каждому двойнику должно быть присвоено имя в зависимости от его ближайшего расстояния к заранее заданному значению, например:

Все двойные ранги от 0 до 2,5 должны называться "a"

Все двойные в диапазоне от 2,5до 7.5 должно быть названо "b"

все двойные числа больше 7,5 должны быть названы "c"

, и после этого все двойные числа будут преобразованы в символ (или строку (?)), так чтоМетод DerveMHM () принимает ввод.

Я был бы очень рад получить предложения.Я новичок в R, и это мой первый пост на Stackoverflow.com.Я не опытный программист, но я изо всех сил стараюсь понять вашу помощь.

РЕДАКТИРОВАТЬ: обновил вопрос, потому что мне нужен «Список именованных векторов символов», точно так же, как в моем примере вышебез изменения порядка.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

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

set.seed(1234)    # Make the results reproducible
x <- runif(10, 0, 20)

tags <- letters[1:3]
breaks <- c(0, 2.5, 7.5, Inf)

names(x) <- tags[findInterval(x, breaks)]

x
#         a          c          c          c          c 
# 2.2740682 12.4459881 12.1854947 12.4675888 17.2183077 
#         c          a          b          c          c 
#12.8062121  0.1899151  4.6510101 13.3216752 10.2850228

Изменить.

Если вынужно, чтобы x относился к классу "character", сначала получить индекс в tags, затем ввести x для символа и только потом присвоить атрибут имен.

i <- findInterval(x, breaks)
x <- as.character(x)
names(x) <- tags[i]
x
#                  a                   c                   c 
# "2.27406822610646"  "12.4459880962968"  "12.1854946576059" 
#                  c                   c                   c 
# "12.4675888335332"  "17.2183076711372"  "12.8062121057883" 
#                  a                   b                   c 
#"0.189915127120912"  "4.65101012028754"   "13.321675164625" 
#                  c 
# "10.2850228268653" 
0 голосов
/ 17 декабря 2018

Вот пример, где x представляет ваш входной вектор.

x <- seq(1, 10, 0.5)

Первый шаг - дать имена вашим элементам в зависимости от их значений.

names(x) <- ifelse(x <= 2.5, "a", ifelse(x > 2.5 & x <= 7.5, "b", "c"))

Далее, разделите ваш вектор и примените as.character.Мы можем использовать by здесь.

lst <- by(x, names(x), as.character, simplify = TRUE)
is.list(lst)
# [1] TRUE

Результат

lst
#names(x): a
#[1] "1"   "1.5" "2"   "2.5"
#----------------------------------------------------------------------------------------------------------------------- 
#names(x): b
# [1] "3"   "3.5" "4"   "4.5" "5"   "5.5" "6"   "6.5" "7"   "7.5"
#----------------------------------------------------------------------------------------------------------------------- 
#names(x): c
#[1] "8"   "8.5" "9"   "9.5" "10" 

Вы также можете использовать split и lapply, как показано ниже, by - сокращениетакого подхода.

lapply(split(x, names(x)), as.character)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...