सभी को नमस्कार, मैं बड़ी सूची के साथ काम कर रहा हूं, जिसमें सूचियां हैं। प्रत्येक उप सूचियों में एन तत्व होते हैं। मैं हमेशा तीसरा प्राप्त करना चाहता हूं, उदा।
l = list()
l[[1]] = list(A=runif(1), B=runif(1), C=runif(1))
l[[2]] = list(A=runif(1), B=runif(1), C=runif(1))
l[[3]] = list(A=runif(1), B=runif(1), C=runif(1))
res = sapply(l, function(x) x$C)
res = sapply(l, function(x) x[[3]]) #alternative
लेकिन मेरी सूची में कई हजार तत्व हैं और मैं इस ऑपरेशन को कई बार कर रहा हूं। तो, ऊपर ऑपरेशन करने के लिए एक तेज तरीका है?
बेस्ट सम्मान करता है,
मारियो
उत्तर:
उत्तर № 1 के लिए 6यदि आप इस मल्टीप्ल टाइम करते हैं, तो आपकी सूची को एक आसान संरचना में परिवर्तित करना बेहतर होगा data.table
.
library(data.table)
DT=rbindlist(l);
res = DT$C
# or if you prefer the 3rd element, not necessarily called "C" then:
res = DT[[3]] # or DT[,C] which might be faster. Please check @richard-scriven comment
वैकल्पिक रूप से यदि आप आधार आर रखना चाहते हैं तो आप इसका उपयोग कर सकते हैं rbind
res = do.call(rbind.data.frame, l)$C # or [[3]]
क्या इससे चीजों को आसान बना दिया जाएगा?
अद्यतन करें
यहां कुछ मानक हैं जो समस्या के विभिन्न समाधान दिखा रहे हैं:
तैयारी:
library(data.table)
library(microbenchmark)
# creating a list and filling it with items
nbr = 1e5;
l = vector("list",nbr)
for (i in 1:nbr) {
l[[i]] = list(A=runif(1), B=runif(1), C=runif(1))
}
# creating data.frame and data.table versions
DT <- rbindlist(l)
DF <- data.frame(rbindlist(l))
बेंच मार्किंग:
# doing the benchmarking
op <-
microbenchmark(
LAPPLY.1 = lapply(l, function(x) x$C),
LAPPLY.2 = lapply(l, `[`, "C"),
LAPPLY.3 = lapply(l, `[[`, "C"),
SAPPLY.1 = sapply(l, function(x) x$C),
SAPPLY.2 = sapply(l, function(x) x[[3]]),
SAPPLY.3 = sapply(l, `[[`, 3),
DT.1 = rbindlist(l)$C,
DT.2 = DT$C,
DF.2 = DF$C,
times = 100
)
परिणाम:
op
## Unit: microseconds
## expr min lq mean median uq max neval
## LAPPLY.1 124088 142390 161672 154415 163240 396761 100
## LAPPLY.2 111397 134745 156012 150062 165229 364539 100
## LAPPLY.3 66965 71608 82975 77329 84949 323041 100
## SAPPLY.1 133220 149093 166653 159222 172495 311857 100
## SAPPLY.2 105917 119533 137990 133364 139216 346759 100
## SAPPLY.3 70391 74726 81910 80520 85792 110062 100
## DT.1 46895 48943 49113 49178 49391 51377 100
## DT.2 8 18 37 47 49 58 100
## DF.2 7 13 33 40 42 82 100
(1) आम तौर पर डेटा जैसी पहली सारणी जैसे डेटा.फ्रेम या डेटाटेबल जैसे टेबल का उपयोग करना सबसे अच्छा होगा - कम से कम उन लागतों के कॉलम का चयन करना।
(2) यदि यह संभव नहीं है तो पहले एक ही ऑपरेशन में मान निकालने के बजाय सूची को डेटा.फ्रेम या डेटाटेबल में बदलना बेहतर होगा।
(3) दिलचस्प रूप से आधार आर (अनुकूलित) के साथ sapply या lapply का उपयोग कर [[
-फंक्शन परिणाम प्रक्रिया समय में होते हैं जो आरबीआईंड का उपयोग करते हुए और कॉलम के रूप में मान निकालने के बजाय केवल दोगुना खराब होते हैं।