[R] Modifying a data frame based on a vector that contains column numbers
William Dunlap
wdunlap at tibco.com
Thu Mar 14 02:28:44 CET 2013
Try looping over columns, as in
fDF <- function (x, column)
{
stopifnot(length(dim(x))==2, all(column > 0), all(column <= ncol(x)), length(column) == nrow(x))
u <- unique(column)
tmp <- split(seq_along(column), factor(column, levels = u))
for (i in seq_along(tmp)) {
x[ tmp[[i]], u[i] ] <- 1
}
x
}
> fDF(mydf, myindex)
c1 c2 c3
1 1 NA NA
2 NA 1 NA
3 NA NA 1
4 NA 1 NA
5 1 NA NA
If you use a matrix instead of a data.frame then the following works and is probably much quicker.
fMat <- function (x, column)
{
stopifnot(is.matrix(x), all(column > 0), all(column <= ncol(x)), length(column) == nrow(x))
x[cbind(seq_len(nrow(x)), column)] <- 1
x
}
Your problem may be better represented with sparse matrices (see the Matrix package).
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Dimitri Liakhovitski
> Sent: Wednesday, March 13, 2013 5:11 PM
> To: r-help
> Subject: [R] Modifying a data frame based on a vector that contains column numbers
>
> Hello!
>
> # I have a data frame:
> mydf<-data.frame(c1=rep(NA,5),c2=rep(NA,5),c3=rep(NA,5))
>
> # I have an index whose length is always the same as nrow(mydf):
> myindex<-c(1,2,3,2,1)
>
> # I need c1 to have 1s in rows 1 and 5 (based on the information in myindex)
> # I need c2 to have 1s in rows 2 and 4 (also based on myindex)
> # I need c3 to have 1 in row 3
> # In other words, I am trying to achieve this result:
> mygoal<-data.frame(c1=c(1,NA,NA,NA,1),c2=c(NA,1,NA,1,NA),c3=c(NA,NA,1,NA,NA))
>
> I know how to do it with a loop that runs through rows of mydf.
> However, in real life I have a huge data frame with tons of rows, dozens of
> columns (instead of 3 in this example) - I am afraid it'll take forever.
> Any hint on how to do it faster, maybe using subindexing somehow?
>
> Thank you very much!
>
> --
> Dimitri Liakhovitski
>
> [[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.
More information about the R-help
mailing list