Hi all, I'd appreciate if anyone can help me with this... I have a data frame that looks like this: 1 + name1 1 2 3 2 + name2 5 9 10 2 - name3 56 74 93 1 - name4 65 75 98 I need to rearrange this in a way so that the rows with "1" in the first column, and "-" in the second column; then columns 4 and 6 should switch places. That is, column 6 would be now column 4 and column 4 would be column 6 (column 5 should stay as column 5) In the same way, if the first column is "2" and the second is "+", then the same rearrangement should be done. Rows with the first two entries 1 + or 2 - should stay in the same order. This should be done for each row independently. Thanks a lot for your help!
On Feb 23, 2010, at 4:27 PM, Laura Rodriguez Murillo wrote:> Hi all, > > I'd appreciate if anyone can help me with this... > > I have a data frame that looks like this: > > 1 + name1 1 2 3 > 2 + name2 5 9 10 > 2 - name3 56 74 93 > 1 - name4 65 75 98 > > I need to rearrange this in a way so that the rows with "1" in the > first column, and "-" in the second column; then columns 4 and 6 > should switch places. That is, column 6 would be now column 4 and > column 4 would be column 6 (column 5 should stay as column 5) > In the same way, if the first column is "2" and the second is "+", > then the same rearrangement should be done. > Rows with the first two entries 1 + or 2 - should stay in the same > order. > This should be done for each row independently.Seems as though there should be a swap function or a fancy indexing solution that would do this but I am not coming up with anything particularly terse. Here is a beginning. You could assign these vectors to new columns (perhaps after (re-)making them numeric ) and delete the old columns if you needed to. Say your dataframe were called "ta": > apply(ta, 1, function(x) ifelse( (x[1]==1 & x[2]=="-")|(x[1]==2 & x[2]=="+"), c(x[6],x[4]), c(x[4],x[6]) )) [1] " 1" "10" "56" "98" > apply(ta, 1, function(x) ifelse( (x[1]==1 & x[2]=="-")|(x[1]==2 & x[2]=="+"), c(x[4],x[6]) , c(x[6],x[4]))) [1] " 3" " 5" "93" "65" -- David.> > Thanks a lot for your help! > > ______________________________________________ > 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.
Try this: a <- b <- read.table(textConnection(" 1 + name1 1 2 3 2 + name2 5 9 10 2 - name3 56 74 93 1 - name4 65 75 98"), skip=1, header=FALSE) swapidx <- with(a, (V1 == 2 & V2 == "+") | (V1 == 1 & V2 == "-")) b[swapidx,] <- b[swapidx, c(1:3,6:4)] This creates an indexing vector that identifies which rows to swap, then the 6:4 flips around the fourth through sixth columns. - Tom On Tue, Feb 23, 2010 at 5:27 PM, Laura Rodriguez Murillo <laura.lmurillo at gmail.com> wrote:> Hi all, > > I'd appreciate if anyone can help me with this... > > I have a data frame that looks like this: > > 1 + name1 1 2 3 > 2 + name2 5 9 10 > 2 - name3 56 74 93 > 1 - name4 65 75 98 > > I need to rearrange this in a way so that the rows with ?"1" in the > first column, and "-" in the second column; then columns 4 and 6 > should switch places. That is, column 6 would be now column 4 and > column 4 would be column 6 (column 5 should stay as column 5) > In the same way, if the first column is "2" and the second is "+", > then the same rearrangement should be done. > Rows with the first two entries 1 + or 2 - should stay in the same order. > This should be done for each row independently. > > Thanks a lot for your help! > > ______________________________________________ > 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. >
Tena koe Laura temp <- yourData[(yourData[,1]==1 & yourData[,2]=='-') | (yourData[,1]==2 & yourData[,2]=='+'),6] Then use similar subsetting to put column 4 into 6, and then temp into column 4. If you don't want to use the intermediary temp then you can use the construct a <- a+b b <- a-b a <- a-b HTH .... Peter Alspach> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Laura > Rodriguez Murillo > Sent: Wednesday, 24 February 2010 11:28 a.m. > To: r-help at r-project.org > Subject: [R] how to rearrange a dataframe > > Hi all, > > I'd appreciate if anyone can help me with this... > > I have a data frame that looks like this: > > 1 + name1 1 2 3 > 2 + name2 5 9 10 > 2 - name3 56 74 93 > 1 - name4 65 75 98 > > I need to rearrange this in a way so that the rows with "1" > in the first column, and "-" in the second column; then > columns 4 and 6 should switch places. That is, column 6 would > be now column 4 and column 4 would be column 6 (column 5 > should stay as column 5) In the same way, if the first column > is "2" and the second is "+", then the same rearrangement > should be done. > Rows with the first two entries 1 + or 2 - should stay in the > same order. > This should be done for each row independently. > > Thanks a lot for your help! > > ______________________________________________ > 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. >