为双打列表创建名称以创建“命名向量列表”

时间:2018-12-17 13:12:48

标签: r naming hidden-markov-models

我想做什么:

aphid 软件包中,有一个函数 deriveHMM()需要与以下列表一起提供:

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的所有双打rangig应命名为“ a”

所有从2.5到7.5的双打都应命名为“ b”

所有大于7.5的双打均应命名为“ c”

,然后将所有双打转换为字符(或字符串(?)),因此方法 deriveHMM()接受输入。

我很高兴有建议。我是R的新手,这是我在Stackoverflow.com上的第一篇帖子。我不是一个经验丰富的程序员,但是我会尽力了解您的帮助。

编辑: 更新了问题,因为我需要的是“字符的命名矢量列表”,就像上面的示例中一样,没有更改顺序。

2 个答案:

答案 0 :(得分:2)

此解决方案使用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强制转换为字符,然后再分配names属性。 / p>

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" 

答案 1 :(得分:1)

这里是一个示例,其中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" 

您还可以如下所示使用splitlapplyby是这种方法的缩写。

lapply(split(x, names(x)), as.character)