এই সমাধানগুলি (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)
1 বি) mutate_last এটি আবার ডেটা ফ্রেম বা ডেটা টেবিলগুলির জন্য একটি বিকল্প ফাংশন যা আবার এর মতো mutate
তবে কেবলমাত্র group_by
(নীচের উদাহরণ হিসাবে) এর মধ্যে ব্যবহৃত হয় এবং প্রতিটি গ্রুপের পরিবর্তে কেবলমাত্র শেষ গ্রুপে কাজ করে। নোট করুন যে সত্য> মিথ্যা তাই যদি 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
বা গাণিতিক logicals মত সচিত্র। এটি ডেটা টেবিলগুলির জন্যও কাজ করে।
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
ডেটা ফ্রেমগুলির জন্য পাইপলাইনে স্কুয়েলডিএফ প্যাকেজটির মাধ্যমে এসকিউএল ব্যবহার করতে পারি (তবে ডেটা টেবিলগুলি না রূপান্তর না করা - এটি ডিপি্লায়ারে একটি বাগ উপস্থাপন করতে পারে d 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 '.'")))
৪) সারি_আর_সামান্য একটি ফেরত দেওয়ার ক্ষেত্রে 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 উত্তর এখানে একটি পর্যালোচনা হচ্ছে।