[R] elegant way to minus on each row of a matrix

0 views
Skip to first unread message

Bo Zhou

unread,
Mar 2, 2008, 12:42:51 PM3/2/08
to r-h...@r-project.org

How to do this in an elegant way formatrix/data frame/zoo?

mat=
1 2 3
4 5 6
7 8 9

vector=
1
2
3


result=
0 1 2
2 3 4
4 5 6

ie
1-1 2-1 3-1
4-2 5-2 6-2
7-3 8-3 9-3

Thanks in advance.

_________________________________________________________________


08
[[alternative HTML version deleted]]

______________________________________________
R-h...@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Henrique Dallazuanna

unread,
Mar 2, 2008, 12:56:22 PM3/2/08
to Bo Zhou, r-h...@r-project.org
Try this:

sweep(mat, 1, vec)


--
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O

Bo Zhou

unread,
Mar 2, 2008, 1:01:12 PM3/2/08
to Mark Leeds, r-h...@r-project.org

Hi Mark, (CC'ing r-help)


Only need to change the parameter from 1 to 2 after that it worked great. Thanks

> t1=matrix(1:15,5,3)

> t1

[,1] [,2] [,3]

[1,] 1 6 11

[2,] 2 7 12

[3,] 3 8 13

[4,] 4 9 14

[5,] 5 10 15

> t2=1:5

> t2

[1] 1 2 3 4 5

> apply(t1,2, function(x) x - t2)

[,1] [,2] [,3]

[1,] 0 5 10

[2,] 0 5 10

[3,] 0 5 10

[4,] 0 5 10

[5,] 0 5 10

>

> Date: Sun, 2 Mar 2008 12:51:53 -0500
> From: mark...@verizon.net
> Subject: RE: [R] elegant way to minus on each row of a matrix
> To: bozho...@hotmail.com
>
> try result<-apply(mat,1, function(.row) .row - vector) but I don't have R
> here so make sure it works.

Dimitris Rizopoulos

unread,
Mar 2, 2008, 12:56:15 PM3/2/08
to Bo Zhou, r-h...@r-project.org
try this:

mat <- matrix(1:9, 3, 3, TRUE)
dat <- as.data.frame(mat)
vec <- 1:3

result.mat <- mat - vec
result.dat <- dat - vec
result.mat
result.dat


I hope it helps.

Best,
Dimitris

----
Dimitris Rizopoulos
Biostatistical Centre
School of Public Health
Catholic University of Leuven

Address: Kapucijnenvoer 35, Leuven, Belgium
Tel: +32/(0)16/336899
Fax: +32/(0)16/337015
Web: http://med.kuleuven.be/biostat/
http://www.student.kuleuven.be/~m0390867/dimitris.htm


Quoting Bo Zhou <bozho...@hotmail.com>:

Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm

Bo Zhou

unread,
Mar 2, 2008, 1:03:07 PM3/2/08
to Henrique Dallazuanna, r-h...@r-project.org

Brilliant!

> t1=matrix(1:15,5,3)
> t1
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
[3,] 3 8 13
[4,] 4 9 14
[5,] 5 10 15
> t2=1:5
> t2

[1] 1 2 3 4 5

> sweep(t1, 1, t2)


[,1] [,2] [,3]
[1,] 0 5 10
[2,] 0 5 10
[3,] 0 5 10
[4,] 0 5 10
[5,] 0 5 10

> Date: Sun, 2 Mar 2008 14:56:22 -0300
> From: www...@gmail.com
> To: bozho...@hotmail.com
> Subject: Re: [R] elegant way to minus on each row of a matrix
> CC: r-h...@r-project.org

_________________________________________________________________
Need to know the score, the latest news, or you need your Hotmail®-get your "fix".

[[alternative HTML version deleted]]

Bo Zhou

unread,
Mar 2, 2008, 1:14:10 PM3/2/08
to Dimitris Rizopoulos, r-h...@r-project.org

Hi Dimitris and everyone

I tried this but now I know why it didn't work out for me initially.

> t1=matrix(1:10,5,2)
> t2=matrix(1,5,1)
> t2
[,1]
[1,] 1
[2,] 1
[3,] 1
[4,] 1
[5,] 1
> t1
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> t1-as.vector(t2)
[,1] [,2]
[1,] 0 5
[2,] 1 6
[3,] 2 7
[4,] 3 8
[5,] 4 9
> t1-t2
Error in t1 - t2 : non-conformable arrays

I'm too used to Matlab I guess.

Cheers,

Bo


> Date: Sun, 2 Mar 2008 18:56:15 +0100
> From: Dimitris....@med.kuleuven.be
> To: bozho...@hotmail.com
> CC: r-h...@r-project.org


> Subject: Re: [R] elegant way to minus on each row of a matrix
>

Reply all
Reply to author
Forward
0 new messages