Re: [R] Apply function to one specific column / Alternative to for loop
Hi, Try: indx - grep(Test,test_df[,1]) ##assuming that there is some pattern res - within(test_df[-indx,],titel - rep(test_df$titel[indx], diff(c(indx,nrow(test_df)+1))-1)) ## If you need to change the class res[] - lapply(res,function(x) if(any(grepl([[:alpha:]],x))) as.character(x) else as.numeric(as.character(x))) ##Using data.frame(cbind()), etc. creates A.K. This option worked great for me! I knew there was a nicer and much faster way to solve this. One thing I already learned about R: Never use for-loops, there is always a better way :-) -- View this message in context: http://r.789695.n4.nabble.com/Apply-function-to-one-specific-column-Alternative-to-for-loop-tp4680566p4680621.html Sent from the R help mailing list archive at Nabble.com. __ R-help@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.
Re: [R] Apply function to one specific column / Alternative to for loop
This might be of some use : http://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r/ Umair Durrani email: umairdurr...@outlook.com Date: Sat, 16 Nov 2013 07:30:29 -0800 From: ron...@gmx.net To: r-help@r-project.org Subject: [R] Apply function to one specific column / Alternative to for loop Hi guys, I am a total newbie to R, so I hope this isn't a totally dumb question. I have a dataframe with a title in one row and the corresponding values in the next rows. Let's take this example: test_df - data.frame(cbind(titel = , x = 4:5, y = 1:2)) test_df = rbind(cbind(titel=1.Test, x=, y=), test_df, cbind(titel=2.Test, x=, y=), test_df, cbind(titel=3.Test, x=, y=), test_df) test_df titel x y 1 1.Test 24 1 35 2 4 2.Test 54 1 65 2 7 3.Test 84 1 95 2 What I want to have is: titel x y 2 1.Test 4 1 3 1.Test 5 2 5 2.Test 4 1 6 2.Test 5 2 8 3.Test 4 1 9 3.Test 5 2 In my example, the title is in every third line, but in my real data there is no pattern. Each title has at least one line but can have x lines. I was able to solve my problem in a for loop with the following code: test_df$titel - as.character(test_df$titel) for (i in 1:nrow(test_df)) { if (nchar(test_df$titel[i])==0){ test_df$titel[i]=test_df$titel[i-1] } } test_df - subset(test_df,test_df$x!=) The problem is, I have a lot of data and the for loop is obviously very slow. Is there a more elegant way to achieve the same? I think I have to use the apply function, but I don't know how to use it with just one column. -- View this message in context: http://r.789695.n4.nabble.com/Apply-function-to-one-specific-column-Alternative-to-for-loop-tp4680566.html Sent from the R help mailing list archive at Nabble.com. __ R-help@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. [[alternative HTML version deleted]] __ R-help@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.
Re: [R] Apply function to one specific column / Alternative to for loop
Hi, Try: indx - grep(Test,test_df[,1]) ##assuming that there is some pattern res - within(test_df[-indx,],titel - rep(test_df$titel[indx], diff(c(indx,nrow(test_df)+1))-1)) ## If you need to change the class res[] - lapply(res,function(x) if(any(grepl([[:alpha:]],x))) as.character(x) else as.numeric(as.character(x))) ##Using data.frame(cbind()), etc. creates A.K. On Saturday, November 16, 2013 11:14 AM, Stageexp ron...@gmx.net wrote: Hi guys, I am a total newbie to R, so I hope this isn't a totally dumb question. I have a dataframe with a title in one row and the corresponding values in the next rows. Let's take this example: test_df - data.frame(cbind(titel = , x = 4:5, y = 1:2)) test_df = rbind(cbind(titel=1.Test, x=, y=), test_df, cbind(titel=2.Test, x=, y=), test_df, cbind(titel=3.Test, x=, y=), test_df) test_df titel x y 1 1.Test 2 4 1 3 5 2 4 2.Test 5 4 1 6 5 2 7 3.Test 8 4 1 9 5 2 What I want to have is: titel x y 2 1.Test 4 1 3 1.Test 5 2 5 2.Test 4 1 6 2.Test 5 2 8 3.Test 4 1 9 3.Test 5 2 In my example, the title is in every third line, but in my real data there is no pattern. Each title has at least one line but can have x lines. I was able to solve my problem in a for loop with the following code: test_df$titel - as.character(test_df$titel) for (i in 1:nrow(test_df)) { if (nchar(test_df$titel[i])==0){ test_df$titel[i]=test_df$titel[i-1] } } test_df - subset(test_df,test_df$x!=) The problem is, I have a lot of data and the for loop is obviously very slow. Is there a more elegant way to achieve the same? I think I have to use the apply function, but I don't know how to use it with just one column. -- View this message in context: http://r.789695.n4.nabble.com/Apply-function-to-one-specific-column-Alternative-to-for-loop-tp4680566.html Sent from the R help mailing list archive at Nabble.com. __ R-help@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. __ R-help@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.