ये समाधान (1) पाइपलाइन को बनाए रखते हैं, (2) इनपुट को अधिलेखित नहीं करते हैं और (3) केवल यह आवश्यक है कि शर्त एक बार निर्दिष्ट की जाए:
1a) mutate_cond डेटा फ़्रेम या डेटा तालिकाओं के लिए एक सरल फ़ंक्शन बनाएं जिन्हें पाइपलाइनों में शामिल किया जा सकता है। यह फ़ंक्शन जैसा है mutate
लेकिन केवल स्थिति को संतुष्ट करने वाली पंक्तियों पर कार्य करता है:
mutate_cond <- function(.data, condition, ..., envir = parent.frame()) {
condition <- eval(substitute(condition), .data, envir)
.data[condition, ] <- .data[condition, ] %>% mutate(...)
.data
}
DF %>% mutate_cond(measure == 'exit', qty.exit = qty, cf = 0, delta.watts = 13)
1b) mutate_last यह डेटा फ़्रेम या डेटा टेबल के लिए एक वैकल्पिक फ़ंक्शन है जो फिर से पसंद है mutate
लेकिन केवल group_by
(नीचे उदाहरण में) के भीतर उपयोग किया जाता है और केवल प्रत्येक समूह के बजाय अंतिम समूह पर काम करता है। ध्यान दें कि TRUE> FALSE इसलिए यदि group_by
कोई शर्त निर्दिष्ट करता है तो mutate_last
केवल उस स्थिति को संतुष्ट करने वाली पंक्तियों पर काम करेगा।
mutate_last <- function(.data, ...) {
n <- n_groups(.data)
indices <- attr(.data, "indices")[[n]] + 1
.data[indices, ] <- .data[indices, ] %>% mutate(...)
.data
}
DF %>%
group_by(is.exit = measure == 'exit') %>%
mutate_last(qty.exit = qty, cf = 0, delta.watts = 13) %>%
ungroup() %>%
select(-is.exit)
2) फैक्टर आउट कंडीशन फैक्टर इसे अतिरिक्त कॉलम बनाकर कंडीशन को बाहर निकालता है जिसे बाद में हटा दिया जाता है। फिर उपयोग ifelse
, replace
या चित्रण के साथ तार्किकों के साथ अंकगणित। यह डेटा टेबल के लिए भी काम करता है।
library(dplyr)
DF %>% mutate(is.exit = measure == 'exit',
qty.exit = ifelse(is.exit, qty, qty.exit),
cf = (!is.exit) * cf,
delta.watts = replace(delta.watts, is.exit, 13)) %>%
select(-is.exit)
3) sqldf हम update
डेटा फ्रेम के लिए पाइप लाइन में sqldf पैकेज के माध्यम से SQL का उपयोग कर सकते हैं (लेकिन डेटा टेबल नहीं जब तक कि हम उन्हें परिवर्तित नहीं करते हैं - यह duspr में बग का प्रतिनिधित्व कर सकता है। dplyr समस्या 1579 देखें )। ऐसा लग सकता है कि हम अवांछनीय रूप से इस कोड में इनपुट को संशोधित कर रहे हैं, update
लेकिन वास्तव में अस्तित्व में आने वाले update
डेटाबेस में इनपुट की एक प्रति पर काम कर रहा है और वास्तविक इनपुट पर नहीं।
library(sqldf)
DF %>%
do(sqldf(c("update '.'
set 'qty.exit' = qty, cf = 0, 'delta.watts' = 13
where measure = 'exit'",
"select * from '.'")))
4) row_case_when यह भी चेक करें कि रिटर्निंग ए टिबबलrow_case_when
में परिभाषित किया गया है
: केस_व्यू के साथ वेक्टर कैसे करें? । यह एक सिंटैक्स का उपयोग करता है case_when
लेकिन पंक्तियों पर लागू होता है।
library(dplyr)
DF %>%
row_case_when(
measure == "exit" ~ data.frame(qty.exit = qty, cf = 0, delta.watts = 13),
TRUE ~ data.frame(qty.exit, cf, delta.watts)
)
नोट 1: हमने इसका उपयोग किया हैDF
set.seed(1)
DF <- data.frame(site = sample(1:6, 50, replace=T),
space = sample(1:4, 50, replace=T),
measure = sample(c('cfl', 'led', 'linear', 'exit'), 50,
replace=T),
qty = round(runif(50) * 30),
qty.exit = 0,
delta.watts = sample(10.5:100.5, 50, replace=T),
cf = runif(50))
नोट 2: कितनी आसानी से पंक्तियों का एक सबसेट को अद्यतन करने को निर्दिष्ट करने की समस्या भी dplyr मुद्दों में चर्चा की है 134 , 631 , 1518 और 1573 के साथ 631 मुख्य थ्रेड जा रहा है और 1573 जवाब यहां की समीक्षा की जा रही है।