我想做什么:
在 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上的第一篇帖子。我不是一个经验丰富的程序员,但是我会尽力了解您的帮助。
编辑: 更新了问题,因为我需要的是“字符的命名矢量列表”,就像上面的示例中一样,没有更改顺序。
答案 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"
您还可以如下所示使用split
和lapply
,by
是这种方法的缩写。
lapply(split(x, names(x)), as.character)