在R中,我有两个矩阵A& B.每个矩阵有两列,超过40,000行。如果矩阵A有(x,y)而矩阵B有(y,z),我想制作一个有(x,z)的新矩阵C.
例如,
<td><input type="checkbox" <?php echo $row->IsActive==1) ? "checked": '' ;?> name="status" id="status"/></td>
我想要一个像下面这样的矩阵
> 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
我使用代表, if ,但我觉得这很耗时。 是否有适合它的功能?创建像C这样的新矩阵的最有效方法是什么?
*事先,当名字相同时,我想把他们得分的中位数值。 对此有何帮助?
答案 0 :(得分:1)
设置数据:
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()
:有一个公式界面可以同时使用img
汇总多个列,但如果您要汇总多个变量,那么它很尴尬)