मुझे पता है कि यहां आसपास कई समान प्रश्न हैं, लेकिन उनमें से कोई भी सटीक मुद्दे को संबोधित नहीं करता है जो मैं कर रहा हूं।
set.seed(4)
df = data.frame(
Key = c("A", "B", "A", "D", "A"),
Val1 = rnorm(5),
Val2 = runif(5),
Val3 = 1:5
)
मैं उन पंक्तियों के मान मानों को शून्य करना चाहता हूं जहां कुंजी == "ए" कॉलम नामों को एक के माध्यम से संदर्भित किया जाता है grep:
cols = grep("Val", names(df), value = TRUE)
आम तौर पर इस मामले में जो मैं चाहता हूं उसे प्राप्त करने के लिए मैं इस data.tableतरह का उपयोग करूंगा :
library(data.table)
df = as.data.table(df)
df[Key == "A", (cols) := 0]
और वांछित आउटपुट इस तरह है:
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
हालाँकि इस बार मुझे उपयोग करने की आवश्यकता है dplyrक्योंकि मैं एक टीम प्रोजेक्ट पर काम कर रहा हूं जहां हर कोई इसका उपयोग करता है। मेरे द्वारा प्रदान किया गया डेटा चित्रण है और मेरा वास्तविक डेटा> 5m पंक्तियों के साथ 16 मान स्तंभों को अद्यतन किया जाना है। एकमात्र समाधान जिसके साथ मैं आ सकता था वह mutate_atइस तरह का उपयोग कर रहा है:
df %>% mutate_at(.vars = vars(cols), .funs = function(x) ifelse(df$Key == "A", 0, x))
हालाँकि, यह मेरे वास्तविक डेटा पर बेहद धीमा प्रतीत होता है । मैं एक समाधान खोजने की उम्मीद कर रहा था जो अधिक सुरुचिपूर्ण है और, इससे भी महत्वपूर्ण बात, तेज है।
मैंने कई संयोजनों का उपयोग करने की कोशिश की है , का mapउपयोग करते हुए unquoting !!, प्रयोग getऔर :=(जो कष्टप्रद रूप :=से data.table में नकाबपोश हो सकते हैं ) आदि, लेकिन मुझे लगता है कि ये समझ कैसे इन कामों के लिए बस एक गहन समाधान बनाने के लिए पर्याप्त गहरी नहीं है।