是否有用于在矩阵中进行索引的 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
我使用了for、if,但我认为这很耗时。
有适合它的功能吗?创建像 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
(参见?aggregate
:cbind()
有一个聚合多列的公式接口,但是如果你有很多变量要聚合就很尴尬)
在 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
我使用了for、if,但我认为这很耗时。 有适合它的功能吗?创建像 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
(参见?aggregate
:cbind()
有一个聚合多列的公式接口,但是如果你有很多变量要聚合就很尴尬)