Bu çözeltiler (1) boru hattını korumak (2) do not girişi ve üzerine (3) tek koşul kez belirtilen gerektirir:
1a) mutate_cond İşlem hatlarına dahil edilebilecek veri çerçeveleri veya veri tabloları için basit bir işlev oluşturun. Bu işlev gibidir, mutateancak yalnızca koşulu sağlayan satırlar üzerinde çalışır:
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 Bu, yine benzer olan mutateancak sadece içinde kullanılan group_by(aşağıdaki örnekte olduğu gibi) ve her gruptan ziyade yalnızca son grupta çalışan veri çerçeveleri veya veri tabloları için alternatif bir işlevdir . DOĞRU> YANLIŞ olduğuna dikkat edin, bu nedenle group_bybir koşul belirtirse mutate_last, yalnızca bu koşulu sağlayan satırlarda çalışacaktır.
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) koşulu parantezin dışında bırakın Koşulu daha sonra kaldırılacak olan fazladan bir sütun yaparak parantezin dışında bırakın. Ardından ifelse, replacegösterildiği gibi mantıksallarla birlikte kullanın veya aritmetik. Bu aynı zamanda veri tabloları için de geçerlidir.
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) sqldfupdate Veri çerçeveleri için boru hattındaki sqldf paketi aracılığıyla SQL kullanabiliriz (ancak bunları dönüştürmedikçe veri tablolarını kullanmayız - bu dplyr'de bir hata olabilir. Bkz. Dplyr sorunu 1579 ). Bu koddaki girdiyi istenmeyen bir şekilde değiştiriyormuşuz gibi görünebilir, updateancak aslında updategeçici olarak oluşturulan veritabanındaki girdinin bir kopyası üzerinde hareket ediyor ve asıl girdiye göre değil.
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 Ayrıca kontrol row_case_whentanımlanan
nasıl case_when ile vektörize: Bir Tibble dönersek? . case_whenSatırlara benzer ancak bunlar için geçerli olan bir sözdizimi kullanır .
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)
)
Not 1: Bunu şu şekilde kullandık :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))
Not 2: kolayca satırların bir alt kümesini güncelleme belirtmek için nasıl bir sorun da dplyr konularda tartışılmıştır 134 , 631 , 1518 ve 1573 ile 631 ana iş parçacığı olma ve 1573 burada cevapları gözden olmak.