从R中的列表中同时获取多个字符的位置

时间:2018-07-26 07:56:45

标签: r

我的数据结构如下:

m 
[[1]]
[[1]][[1]]
[1] "g" "g" "h" "k" "k" "k" "l"
[[2]]
[[2]][[1]]
[1] "g" "h" "k" "k" "k" "l" "g"
[[3]]
[[3]][[1]]
[1] "g" "h" "h" "h" "k" "l" "h"

我想同时查找每个唯一字符的位置。我可以分别使用以下代码获取每个字符的位置:

t<-list()
for (i in 1:length(m)){
for (j in m[[i]][[1]]){
if (j=="k"){
t[[i]]<-grep(j,m[[i]][[1]],fixed=TRUE)}}}

我得到的结果如下:

t
[[1]]
[1] 4 5 6
[[2]]
[1] 3 4 5
[[3]]
[1] 5

列表m中有4个唯一字符,使用我的代码,我将获得4个具有唯一字符位置的列表,但我必须手动将每个字符输入循环。我只需要一个代码即可计算所有 同时具有唯一字符。

2 个答案:

答案 0 :(得分:1)

列表中的向量似乎都具有相等的长度(如果没有,则可以通过使其长度相等来进行调整)。我将首先重组数据:

m <- list(list(c("g", "g", "h", "k", "k", "k", "l")),
          list(c("g", "h", "k", "k", "k", "l", "g")))

m <- do.call(rbind, lapply(m, "[[", 1))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] "g"  "g"  "h"  "k"  "k"  "k"  "l" 
#[2,] "g"  "h"  "k"  "k"  "k"  "l"  "g" 

然后,您可以使用outer一次进行所有比较:

res <- which(outer(m, unique(c(m)), "=="), arr.ind = TRUE)
res <- as.data.frame(res)
res$dim3 <- factor(res$dim3, labels = unique(c(m)))
names(res) <- c("list_element", "vector_element", "letter")

#check
res[res$letter == "k" & res$list_element == 1, "vector_element"]
[1] 4 5 6

如果您的数据量很大,此解决方案将无法正常工作。

答案 1 :(得分:0)

我们可以对<?php $xml=simplexml_load_file("zoo.xml") or die("Error: Cannot create object"); foreach($xml->children() as $desc) { echo $desc->title . " "; echo $desc->price . " лв. "; echo ' some text here' . "<br>"; } ?> 使用双循环,在lapply中对每个which值使用unique检查位置

m

要确定哪些值代表哪个字符,我们可以命名lst <- lapply(unique(unlist(m)), function(x) lapply(m, function(y) which(x == y[[1]]))) lst #[[1]] #[[1]][[1]] #[1] 1 2 #[[1]][[2]] #[1] 1 7 #[[1]][[3]] #[1] 1 #[[2]] #[[2]][[1]] #[1] 3 #[[2]][[2]] #[1] 2 #[[2]][[3]] #[1] 2 3 4 7 ......

list