[R] How to apply functions across columns?
Hello, me again. I have a data frame that looks like this (actual dput output at bottom): head(tencor) datelot wf.id s1 s2 s3 s4 s5 1 08.05.2012 W0X3H0 9 1238 1263 1244 1200 1183 2 08.05.2012 W0X3H010 1367 1396 1371 1325 1311 3 08.05.2012 W0X3H011 1383 1417 1393 1346 1328 I'd like to add a column to this that gives, for each row, the averages of the values in the columns s1 to s5. Really primitive. But I totally absolute don't understand how to do this. I don't need any intelligence, I know my values are always in columns 4:8. Thanks, robert dput(tencor) structure(list(date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = 08.05.2012, class = factor), lot = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = W0X3H0, class = factor), wf.id = c(9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 4L), s1 = c(1238L, 1367L, 1383L, 1395L, 1479L, 1411L, 1404L, 1398L, 1402L, 1380L, 1376L), s2 = c(1263L, 1396L, 1417L, 1420L, 1527L, 1452L, 1438L, 1432L, 1432L, 1412L, 1403L), s3 = c(1244L, 1371L, 1393L, 1395L, 1497L, 1424L, 1410L, 1404L, 1398L, 1382L, 1385L), s4 = c(1200L, 1325L, 1346L, 1346L, 1444L, 1372L, 1361L, 1362L, 1359L, 1338L, 1334L), s5 = c(1183L, 1311L, 1328L, 1336L, 1426L, 1357L, 1347L, 1344L, 1339L, 1325L, 1322L)), .Names = c(date, lot, wf.id, s1, s2, s3, s4, s5), class = data.frame, row.names = c(NA, -11L)) __ 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] How to apply functions across columns?
Good reproducible example ;-) Easiest is probably just: cbind(tencor, ThisRowMean = rowMeans(tencor[, 4:8])) # Whatever you replace ThisRowMean with will become the column name Best, Michael On Wed, May 9, 2012 at 10:12 AM, Robert Latest boblat...@gmail.com wrote: Hello, me again. I have a data frame that looks like this (actual dput output at bottom): head(tencor) date lot wf.id s1 s2 s3 s4 s5 1 08.05.2012 W0X3H0 9 1238 1263 1244 1200 1183 2 08.05.2012 W0X3H0 10 1367 1396 1371 1325 1311 3 08.05.2012 W0X3H0 11 1383 1417 1393 1346 1328 I'd like to add a column to this that gives, for each row, the averages of the values in the columns s1 to s5. Really primitive. But I totally absolute don't understand how to do this. I don't need any intelligence, I know my values are always in columns 4:8. Thanks, robert dput(tencor) structure(list(date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = 08.05.2012, class = factor), lot = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = W0X3H0, class = factor), wf.id = c(9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 4L), s1 = c(1238L, 1367L, 1383L, 1395L, 1479L, 1411L, 1404L, 1398L, 1402L, 1380L, 1376L), s2 = c(1263L, 1396L, 1417L, 1420L, 1527L, 1452L, 1438L, 1432L, 1432L, 1412L, 1403L), s3 = c(1244L, 1371L, 1393L, 1395L, 1497L, 1424L, 1410L, 1404L, 1398L, 1382L, 1385L), s4 = c(1200L, 1325L, 1346L, 1346L, 1444L, 1372L, 1361L, 1362L, 1359L, 1338L, 1334L), s5 = c(1183L, 1311L, 1328L, 1336L, 1426L, 1357L, 1347L, 1344L, 1339L, 1325L, 1322L)), .Names = c(date, lot, wf.id, s1, s2, s3, s4, s5), class = data.frame, row.names = c(NA, -11L)) __ 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.
Re: [R] How to apply functions across columns?
On Wed, May 9, 2012 at 4:19 PM, R. Michael Weylandt michael.weyla...@gmail.com wrote: Good reproducible example ;-) Easiest is probably just: cbind(tencor, ThisRowMean = rowMeans(tencor[, 4:8])) Actually, after frying my brain on tapply() and sapply() I found that just plain apply() does what I need: tencor$mean - apply(tencor[4:8], 1, FUN=mean) This way I'm also not tied to just mean() as aggregator but can use any homemade function (this would have been my followup question had I followed your advice ;-) Thanks! robert __ 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] How to apply functions across columns?
Indeed, apply is very flexible and idiomatically R (i.e., the right way to do it) -- but, just a heads up, for datasets with many rows/columns rowMeans and colMeans will be *much* faster (there's loop overhead in the apply family) Best, Michael On Wed, May 9, 2012 at 3:46 PM, Robert Latest boblat...@gmail.com wrote: On Wed, May 9, 2012 at 4:19 PM, R. Michael Weylandt michael.weyla...@gmail.com wrote: Good reproducible example ;-) Easiest is probably just: cbind(tencor, ThisRowMean = rowMeans(tencor[, 4:8])) Actually, after frying my brain on tapply() and sapply() I found that just plain apply() does what I need: tencor$mean - apply(tencor[4:8], 1, FUN=mean) This way I'm also not tied to just mean() as aggregator but can use any homemade function (this would have been my followup question had I followed your advice ;-) Thanks! robert __ 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.