Một tùy chọn khác:
data %>%
mutate(sum = rowSums(., na.rm = TRUE))
Benchmark
library(microbenchmark)
mbm <- microbenchmark(
steven = data %>% mutate(sum = rowSums(., na.rm = TRUE)),
lyz = data %>% rowwise() %>% mutate(sum = sum(a, b, c, na.rm=TRUE)),
nar = apply(data, 1, sum, na.rm = TRUE),
akrun = data %>% mutate_each(funs(replace(., which(is.na(.)), 0))) %>% mutate(sum=a+b+c),
frank = data %>% mutate(sum = Reduce(function(x,y) x + replace(y, is.na(y), 0), .,
init=rep(0, n()))),
times = 10)
#Unit: milliseconds
# expr min lq mean median uq max neval cld
# steven 9.493812 9.558736 18.31476 10.10280 22.55230 65.15325 10 a
# lyz 6791.690570 6836.243782 6978.29684 6915.16098 7138.67733 7321.61117 10 c
# nar 702.537055 723.256808 799.79996 805.71028 849.43815 909.36413 10 b
# akrun 11.372550 11.388473 28.49560 11.44698 20.21214 155.23165 10 a
# frank 20.206747 20.695986 32.69899 21.12998 25.11939 118.14779 10 a
Nguồn
2015-11-19 14:44:20
thật tuyệt vời! Cảm ơn bạn rất nhiều – ckluss
Bạn đang rất chào đón @ckluss. Tôi đã cung cấp cách "dplyr -ic" nhất (nếu tôi có thể nói điều này, theo nghĩa là nó đang sử dụng dplyr theo cách truyền thống theo hướng dẫn) khi thực hiện nó. Tuy nhiên, việc sử dụng các hàm cơ sở khác (một mình hoặc kết hợp với dplyr) chắc chắn hiệu quả hơn tôi. Câu trả lời của StevenBeaupre và Akrun là hiệu quả hơn vì vậy bạn có lẽ sẽ tốt hơn với những người đó nếu tốc độ là quan trọng với bạn. – LyzandeR
@LyzandeR Tôi đoán OP muốn 'cách dplyr'ish. Vì vậy, đừng lo lắng về hiệu quả. – akrun