【问题标题】:Indices of a unique vector唯一向量的索引
【发布时间】:2013-04-22 23:30:07
【问题描述】:

我在 R 中有 2 个向量。我可以生成一个由它们的唯一元素组成的向量,但我需要知道向量 a 的每个元素的索引,例如:

 x <- c(0, 0, 2, 4, 8)
 y <- c(1, 4, 6, 6, Inf)
 a <- unique(sort(c(x, y)))

 > a
 [1]   0   1   2   4   6   8 Inf

我需要证明0(在a中)的索引是x1x21的索引是y12的索引是@987654330 @,对于4,它们是x4y2 等。

我如何在 R 中做到这一点?

【问题讨论】:

    标签: r vector indexing


    【解决方案1】:
    sapply(unique(x), function(z) which(x==z)  )
    

    这是非常基本的东西,你真的应该学习 R 的介绍并在你的控制台上操作示例。

    【讨论】:

    • 只是分别给出x和y的索引,但我想要a的索引而不是x和y。
    • 我不明白你为什么不直接插入 a 代替 x 如果这是你想要的。
    • 我用 a 代替了 x,结果如下: > sapply(a, function(z) which(a==z) ) [1] 1 2 3 4 5 6 7 这不是我的渴望结果。
    • sapply(a, function(z) which(x==z) ) 表示xa 中的位置,sapply(a, function(z) which(y==z) ) 表示y 的位置。
    • 很好,但是我怎样才能将结果放在一个列表中而不是两个列表中,这意味着不是单独的,而不是 1,例如 x[1]。
    【解决方案2】:

    为什么不给原始向量命名,然后用tapply得到你想要的东西

    names(x) <- paste0('x', seq_along(x))
    names(y) <- paste0('y', seq_along(y))
    
    # combine and sort
    xy <- sort(c(x,y))
    xy
    ## x1  x2  y1  x3  x4  y2  y3  y4  x5  y5 
    ##  0   0   1   2   4   4   6   6   8 Inf 
    
    tapply(names(xy), xy, list)
    
    # $`0`
    # [1] "x1" "x2"
    # 
    # $`1`
    # [1] "y1"
    # 
    # $`2`
    # [1] "x3"
    # 
    # $`4`
    # [1] "x4" "y2"
    # 
    # $`6`
    # [1] "y3" "y4"
    # 
    # $`8`
    # [1] "x5"
    # 
    # $`Inf`
    # [1] "y5"
    

    【讨论】:

    • paste 和 paste0 有什么区别?因为我可以用 paste 得到相同的结果,但是当我想用 paste0 做时,我得到了这个错误:错误:找不到函数“paste0”。
    • R 的较新版本有 paste0,它基本上是 paste(..., sep ="") 的稍快版本。
    【解决方案3】:

    我猜你想要一个函数,应用于a,它将返回找到每个元素的向量的名称以及该向量中的位置。

    这不是很漂亮,但应该做你想做的:

    fun1 <- function(i) {
            res <- NULL
            if (a[i] %in% x) res <- paste("x",which(x==a[i]),sep="")
            if (a[i] %in% y) res <- c(res, paste(" y",which(y==a[i]),sep=""))
            names(res) <- rep(a[i],length(res))
            return(res)
            }
    

    然后

    unlist(sapply(1:length(a), FUN = fun1))
    

    给予

        0     0     1     2     2     4     6     6     8   Inf 
     "x1"  "x2" " y1"  "x3" " y2"  "x4" " y3" " y4"  "x5" " y5"
    

    更新这是你要找的吗?

    fun1 <- function(i) {
        res1 <- res2 <- NULL
        if (a[i] %in% x) res1 <- paste("x", which(x %in% a[i]),sep="",collapse=" ")            
        if (a[i] %in% y) res2 <- paste("y", which(y %in% a[i]),sep="",collapse=" ")
        res <- paste(res1,res2,collapse="")
        names(res) <- a[i]
        ascii:::trim(res)
        }
    

    与以前相同的用法,给出

          0       1       2       4       6       8     Inf 
    "x1 x2"    "y1" "x3 y2"    "x4" "y3 y4"    "x5"    "y5" 
    

    【讨论】:

    • 感谢您的回复。我们能不能用两个零代替一个零,在它下面有“x1”和“x2”,还有2和6。
    • 我们能不能用两个零代替一个零,在它下面有“x1”和“x2”,还有2和6。
    • 你能告诉我什么是 ascii:::trim() 吗?
    • 这是一种在包命名空间ascii 中访问函数trim() 的方法,而无需使用require(ascii) 加载整个包。我把它放进去是为了让演示文稿更整洁。如果您还没有,则需要install.packages("ascii")。包stringr 是一个更通用的字符串操作选择。
    • 非常感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2013-03-15
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多