Buralarda birkaç benzer soru olduğunu biliyorum, ancak hiçbiri yaşadığım kesin sorunu ele almıyor gibi görünüyor.
set.seed(4)
df = data.frame(
Key = c("A", "B", "A", "D", "A"),
Val1 = rnorm(5),
Val2 = runif(5),
Val3 = 1:5
)
Key == "A" sütun adlarının bulunduğu satırlar için değer sütunlarının değerlerini sıfırlamak istiyorum grep
:
cols = grep("Val", names(df), value = TRUE)
Normalde bu durumda istediğim şeyi elde etmek için şu şekilde kullanırdım data.table
:
library(data.table)
df = as.data.table(df)
df[Key == "A", (cols) := 0]
Ve istenen çıktı şu şekildedir:
Key Val1 Val2 Val3
1 A 0.000000 0.00000000 0
2 B -1.383814 0.55925762 2
3 A 0.000000 0.00000000 0
4 D 1.437151 0.05632773 4
5 A 0.000000 0.00000000 0
Ancak bu sefer dplyr
herkesin kullandığı bir ekip projesi üzerinde çalışırken kullanmam gerekiyor. Verdiğim veriler açıklayıcı ve gerçek verilerim güncellenecek 16 değer sütunu olan> 5m. Gelebileceğim tek çözüm şöyle kullanmaktır mutate_at
:
df %>% mutate_at(.vars = vars(cols), .funs = function(x) ifelse(df$Key == "A", 0, x))
Ancak, bu gerçek verilerim üzerinde son derece yavaş görünüyor . Daha zarif ve daha da önemlisi daha hızlı bir çözüm bulmayı umuyordum.
Ben kullanarak birçok kombinasyon denedim , kullanarak map
unquoting !!
, kullanma get
ve :=
(hangi can sıkıcı bir şekilde :=
in data.table tarafından maskelenebilir ) vb, ama bence bu çalışma nasıl geçerli bir çözüm oluşturmak için yeterince derin değil.