मेरे पास एक स्क्रिप्ट है जो सीएसवी फ़ाइल से डेटा को एक में पढ़ता है data.table
और फिर एक कॉलम में कई नए कॉलमों में पाठ को विभाजित करता है। मैं वर्तमान में ऐसा करने के लिए lapply
और strsplit
कार्यों का उपयोग कर रहा हूं । यहाँ एक उदाहरण है:
library("data.table")
df = data.table(PREFIX = c("A_B","A_C","A_D","B_A","B_C","B_D"),
VALUE = 1:6)
dt = as.data.table(df)
# split PREFIX into new columns
dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1))
dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2))
dt
# PREFIX VALUE PX PY
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D
कॉलम के ऊपर के उदाहरण PREFIX
में दो नए कॉलम PX
और PY
"_" वर्ण पर विभाजित किया गया है ।
हालांकि यह ठीक काम करता है, मैं सोच रहा था कि क्या इस का उपयोग करने के लिए एक बेहतर (अधिक कुशल) तरीका है data.table
। मेरे असली डेटासेट में> = 10M + पंक्तियाँ हैं, इसलिए समय / मेमोरी दक्षता वास्तव में महत्वपूर्ण हो जाती है।
अपडेट करें:
@ फ्रैंक के सुझाव के बाद मैंने एक बड़ा परीक्षण मामला बनाया और सुझाए गए आदेशों का उपयोग किया, लेकिन stringr::str_split_fixed
मूल विधि की तुलना में बहुत अधिक समय लगता है।
library("data.table")
library("stringr")
system.time ({
df = data.table(PREFIX = rep(c("A_B","A_C","A_D","B_A","B_C","B_D"), 1000000),
VALUE = rep(1:6, 1000000))
dt = data.table(df)
})
# user system elapsed
# 0.682 0.075 0.758
system.time({ dt[, c("PX","PY") := data.table(str_split_fixed(PREFIX,"_",2))] })
# user system elapsed
# 738.283 3.103 741.674
rm(dt)
system.time ( {
df = data.table(PREFIX = rep(c("A_B","A_C","A_D","B_A","B_C","B_D"), 1000000),
VALUE = rep(1:6, 1000000) )
dt = as.data.table(df)
})
# user system elapsed
# 0.123 0.000 0.123
# split PREFIX into new columns
system.time ({
dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1))
dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2))
})
# user system elapsed
# 33.185 0.000 33.191
इसलिए इस str_split_fixed
विधि में लगभग 20 गुना अधिक समय लगता है।
stringr
पैकेज का उपयोग करते हैं , तो यह कमांड हैstr_split_fixed(PREFIX,"_",2)
:। मैं जवाब नहीं दे रहा हूं क्योंकि मैंने स्पीडअप का परीक्षण नहीं किया है ... या, एक चरण में:dt[,c("PX","PY"):=data.table(str_split_fixed(PREFIX,"_",2))]