I need to develop a simple list manipulation. Although it seems easier to do it in matrix form, but I need it in list form. I have a matrix x <- matrix(c(12.1, 3.44, 0.1, 3, 12, 33.1, 1.1, 23), nrow=2) for list form example, the conversion is x.list <- lapply(seq_len(nrow(x)), function(i) x[i,]) ### list version calcnorm=function(a, b){ diff <- mapply("-", a, b) diff2 <- mapply("*", diff, diff) sqrt.diff <-sqrt(sum(diff2)) return(sqrt.diff) } calcnorm2=function(a,X){ lapply(X, calcnorm, a) } lapply(x.list, calcnorm, x.list) [[1]] [[1]][[1]] [1] 0 [[1]][[2]] [1] 31.75257 [[2]] [[2]][[1]] [1] 31.75257 [[2]][[2]] [1] 0 ### matrix version calcnorm.const=function(a,b){ return(sqrt((a-b)%*%(a-b))) } calcnorm2.const=function(a,data){ apply(data,1,calcnorm.const,a) } apply(x,1,calcnorm2.const,x) [,1] [,2] [1,] 0.00000 31.75257 [2,] 31.75257 0.00000 Ideally, for later purposes, the list form of the output should be something like [[1]] [1,] 0 31.75257 [[2]] [2,] 31.75257 0 I am getting confused here. Could anyone help me out for the right output FORM? ishida [[alternative HTML version deleted]]
there is a typo. lapply(x.list, calcnorm, x.list) should be lapply(x.list, calcnorm2, x.list) sorry. 2013/3/10 ishi soichi <soichi777@gmail.com>> I need to develop a simple list manipulation. Although it seems easier to > do it in matrix form, but I need it in list form. > > I have a matrix > > x <- matrix(c(12.1, 3.44, 0.1, 3, 12, 33.1, 1.1, 23), nrow=2) > > for list form example, the conversion is > > x.list <- lapply(seq_len(nrow(x)), function(i) x[i,]) > > > ### list version > calcnorm=function(a, b){ > diff <- mapply("-", a, b) > diff2 <- mapply("*", diff, diff) > sqrt.diff <-sqrt(sum(diff2)) > return(sqrt.diff) > } > calcnorm2=function(a,X){ > lapply(X, calcnorm, a) > } > lapply(x.list, calcnorm, x.list) > > [[1]] > [[1]][[1]] > [1] 0 > > [[1]][[2]] > [1] 31.75257 > > > [[2]] > [[2]][[1]] > [1] 31.75257 > > [[2]][[2]] > [1] 0 > > > ### matrix version > calcnorm.const=function(a,b){ > return(sqrt((a-b)%*%(a-b))) > } > calcnorm2.const=function(a,data){ > apply(data,1,calcnorm.const,a) > } > apply(x,1,calcnorm2.const,x) > > [,1] [,2] > [1,] 0.00000 31.75257 > [2,] 31.75257 0.00000 > > Ideally, for later purposes, the list form of the output should be > something like > > [[1]] > [1,] 0 31.75257 > [[2]] > [2,] 31.75257 0 > > I am getting confused here. Could anyone help me out for the right output > FORM? > > ishida >[[alternative HTML version deleted]]
Hi, For the first case: lst2<-lapply(x.list, calcnorm2, x.list) ?lapply(lst2,function(x) do.call("c",x)) #[[1]] #[1]? 0.00000 31.75257 #[[2]] #[1] 31.75257? 0.00000 A.K. For the second case: ?lst1<-as.list(data.frame(t(apply(x,1,calcnorm2.const,x)))) ?names(lst1)<- NULL ?lst1 #[[1]] #[1] ?0.00000 31.75257 #[[2]] #[1] 31.75257 ?0.00000 A.K. ----- Original Message ----- From: ishi soichi <soichi777 at gmail.com> To: r-help <r-help at r-project.org> Cc: Sent: Sunday, March 10, 2013 1:18 AM Subject: Re: [R] list + lapply insead of matrix + apply there is a typo. lapply(x.list, calcnorm, x.list) should be lapply(x.list, calcnorm2, x.list) sorry. 2013/3/10 ishi soichi <soichi777 at gmail.com>> I need to develop a simple list manipulation. Although it seems easier to > do it in matrix form, but I need it in list form. > > I have a matrix > > x <- matrix(c(12.1, 3.44, 0.1, 3, 12, 33.1, 1.1, 23), nrow=2) > > for list form example, the conversion is > > x.list <- lapply(seq_len(nrow(x)), function(i) x[i,]) > > > ### list version > calcnorm=function(a, b){ >? ? diff <- mapply("-", a, b) >? ? diff2 <- mapply("*", diff, diff) >? ? sqrt.diff <-sqrt(sum(diff2)) >? ? return(sqrt.diff) > } > calcnorm2=function(a,X){ >? ? lapply(X, calcnorm, a) > } > lapply(x.list, calcnorm, x.list) > > [[1]] > [[1]][[1]] > [1] 0 > > [[1]][[2]] > [1] 31.75257 > > > [[2]] > [[2]][[1]] > [1] 31.75257 > > [[2]][[2]] > [1] 0 > > > ### matrix version > calcnorm.const=function(a,b){ >? ? return(sqrt((a-b)%*%(a-b))) > } > calcnorm2.const=function(a,data){ >? ? apply(data,1,calcnorm.const,a) > } > apply(x,1,calcnorm2.const,x) > >? ? ? ? ? [,1]? ? [,2] > [1,]? 0.00000 31.75257 > [2,] 31.75257? 0.00000 > > Ideally, for later purposes, the list form of the output should be > something like > > [[1]] > [1,]? 0 31.75257 > [[2]] > [2,] 31.75257? 0 > > I am getting confused here. Could anyone help me out for the right output > FORM? > > ishida >??? [[alternative HTML version deleted]] ______________________________________________ R-help at 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.