2

我在 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(in a) 的索引是x1x2,的索引1y1,对于2它是x3,因为4它们是x4等等y2

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

4

3 回答 3

5
sapply(unique(x), function(z) which(x==z)  )

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

于 2013-04-22T23:36:41.630 回答
1

我猜你想要一个函数,应用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" 
于 2013-04-23T00:15:58.607 回答
1

为什么不命名原始向量,然后用它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"
于 2013-04-24T01:57:21.643 回答