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, mutate
ancak 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 mutate
ancak 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_by
bir 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
, replace
gö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, update
ancak aslında update
geç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_when
tanımlanan
nasıl case_when ile vektörize: Bir Tibble dönersek? . case_when
Satı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.