是否有用于在矩阵中进行索引的 R 函数?

Is there an R function for indexing in a matrix?

在 R 中,我有两个矩阵 A 和 B。每个矩阵有两列和超过 40,000 行。如果矩阵 A 有 (x,y),矩阵 B 有 (y,z),我想创建一个新的矩阵 C,它有 (x,z)。

例如,

> A
   UserID Name
 1    1    a
 2    2    b
 3    3    c
 4    4    a

> B
   Name Score
 1   c   100
 2   a   300
 3   b   200
 4   a   400

我想要一个如下所示的矩阵

> C
   UserID Score
 1    3    100
 2    1    350
 3    2    200

我使用了forif,但我认为这很耗时。 有适合它的功能吗?创建像 C 这样的新矩阵的最有效方法是什么?

*事先,当名字相同时,我想把他们的分数取中值。 有什么帮助吗?

设置数据:

A <- read.table(header=TRUE,
text="UserID Name
1    a
2    b
3    c
4    a")

B <- read.table(header=TRUE,
text="Name Score
c   100
a   300
b   200
a   400")

聚合数据以按名称和用户 ID 将分数替换为每个名称的第一个用户 ID:

B2 <- aggregate(Score~Name,B,median)
A2 <- aggregate(UserID~Name,A,head,1)

现在merge:

merge(A2,B2)

##  Name UserID Score
##1    a      1   350
##2    b      2   200
##3    c      3   100

这些顺序不同,保留了 Name 列,但在其他方面符合您的要求...如果您确定所有内容都正确匹配,cbind() 也是可行的,但是 merge 更安全。

如果您想一次聚合几个得分列:

B3 <- read.table(header=TRUE,
text="Name Score1 Score2 Score3
c   100 200 1
a   300 23  7
b   200 94  6
a   400 20  2")

你可以试试

B4 <- aggregate(B3[,-1],by=list(B3$Name),median)
names(B4)[1] <- "Name"
##   Name Score1 Score2 Score3
## 1    a    350   21.5    4.5
## 2    b    200   94.0    6.0
## 3    c    100  200.0    1.0

(参见?aggregatecbind()有一个聚合多列的公式接口,但是如果你有很多变量要聚合就很尴尬)