Here is another alternative using purrr :
library(purrr) df %>% by_row(function(x) { sum(x[-1] == 2) }, .to = "numtwos", .collate = "cols" )
What gives:
#Source: local data frame [5 x 5] # # ID X1 X2 X3 numtwos # <fctr> <int> <int> <int> <int> #1 A 2 5 2 2 #2 B 2 5 1 1 #3 C 3 4 4 0 #4 D 5 4 2 1 #5 E 2 1 4 1
As pointed out by NEWS , string-based functionalities still mature in dplyr :
We are still dplyr out what belongs to dplyr and what belongs to purrr . Expect a lot of experimentation and a lot of changes with these features.
Benchmark
We can see how rowwise() and do() compared with purrr::by_row() for this type of problem and how they "perform" against rowSums() and the way the data is neat:
largedf <- df[rep(seq_len(nrow(df)), 10e3), ] library(microbenchmark) microbenchmark( steven = largedf %>% by_row(function(x) { sum(x[-1] == 2) }, .to = "numtwos", .collate = "cols"), psidom = largedf %>% rowwise %>% do(data_frame(numtwos = sum(.[-1] == 2))) %>% cbind(largedf, .), gopala = largedf %>% gather(key, value, -ID) %>% group_by(ID) %>% summarise(numtwos = sum(value == 2)) %>% inner_join(largedf, .), evan = largedf %>% mutate(numtwos = rowSums(. == 2)), times = 10L, unit = "relative" )
Results:
#Unit: relative # expr min lq mean median uq max neval cld # steven 1225.190659 1261.466936 1267.737126 1227.762573 1276.07977 1339.841636 10 b # psidom 3677.603240 3759.402212 3726.891458 3678.717170 3728.78828 3777.425492 10 c # gopala 2.715005 2.684599 2.638425 2.612631 2.59827 2.572972 10 a # evan 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000 10 a
source share