मेरे पास इस तरह के कॉलम के साथ 300K पंक्ति डेटाफ्रेम है:
db$performance[1:10]
[1] "1C1CCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCC"
"4321CCCCCCCCCCCCCCCCCCCCC" "321CCCCCCCCCCCCCCCCCCCCCC"
[5] "CCCCCCCCCCCCCC" "4321CCCCCCCCCCCCC0" "211CCCCCCCCCCCCCCCCCCCCCC" "BCCCCCCCCC" [9] "BCCCCCCCCC" "8"
मैं उस कॉलम की प्रत्येक पंक्ति को खोजना चाहता हूं और अंतिम (दाएं से बाएं) 18 वर्ण तत्वों के भीतर होने वाले "4" की संख्या गिनना चाहता हूं। मेरे पास लूप समाधान स्पष्ट रूप से खराब है, क्योंकि यह बहुत धीमा है (6 मिनट या अधिक)। नीचे देखें। मैं समाधान को सदिश कैसे बना सकता हूं (लागू, और/या dplyr का उपयोग करके?)
धन्यवाद!
substrRight <- function(x, n){
substr(x, nchar(x)-n, nchar(x))
}
db$NewVar = NA
for (N in 1:nrow(db)){
db$NewVar[N] = str_count( substrRight(db$performance[N],18), "4")
}
1
nerdlyfe
26 जून 2019, 23:11
1 उत्तर
सबसे बढ़िया उत्तर
str_count
और substr
पहले से ही वेक्टरकृत हैं। तो, फ़ंक्शन को सीधे पूरे कॉलम पर लागू करें
library(stringr)
str_count(substrRight(db$performance, 18), "4")
#[1] 0 0 0 0 0 1 0 0 0 0
यह काफी तेज होना चाहिए। बड़े डेटासेट पर समय की जाँच करना
मानक
db1 <- db[rep(seq_len(nrow(db)), 1e5),, drop = FALSE]
system.time({
out <- numeric(nrow(db1))
for (i in seq_len(nrow(db1))){
out[i]= str_count( substrRight(db1$performance[i],18), "4")
}
})
# user system elapsed
# 14.699 0.104 14.755
system.time({
sapply(db1$performance, function(x) str_count( substrRight(x,18), "4") )
})
# user system elapsed
# 14.267 0.075 14.299
system.time({
str_count(substrRight(db1$performance, 18), "4")
})
# user system elapsed
# 0.437 0.016 0.452
आंकड़े
db <- structure(list(performance = c("1C1CCCCCCCCCCCCCCCCCCCCCC", "CCCCCCCCCCCCC",
"4321CCCCCCCCCCCCCCCCCCCCC", "321CCCCCCCCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCC",
"4321CCCCCCCCCCCCC0", "211CCCCCCCCCCCCCCCCCCCCCC", "BCCCCCCCCC",
"BCCCCCCCCC", "8")), class = "data.frame", row.names = c(NA,
-10L))
4
akrun
26 जून 2019, 23:29