/ / आर सूची, सूची, सूची की सूची से तत्व निकालने के लिए तेजी से रास्ता

सूची - आर, सूची की सूचियों से तत्व निकालने के लिए आर तेज़ तरीका

सभी को नमस्कार, मैं बड़ी सूची के साथ काम कर रहा हूं, जिसमें सूचियां हैं। प्रत्येक उप सूचियों में एन तत्व होते हैं। मैं हमेशा तीसरा प्राप्त करना चाहता हूं, उदा।

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 का उपयोग कर [[-फंक्शन परिणाम प्रक्रिया समय में होते हैं जो आरबीआईंड का उपयोग करते हुए और कॉलम के रूप में मान निकालने के बजाय केवल दोगुना खराब होते हैं।