1. चिड़ियाघर। चिड़ियाघर पैकेज में एक मल्टीवे मर्ज फ़ंक्शन है जो इसे कॉम्पैक्ट कर सकता है। lapply
एक चिड़ियाघर वस्तु को myList
के प्रत्येक घटक धर्मान्तरित और फिर हम बस उन्हें सब विलय:
# optionally add nice names to the list
names(myList) <- paste("t", seq_along(myList), sep = "")
library(zoo)
fz <- function(x)with(as.data.frame(x, stringsAsFactors=FALSE), zoo(Freq, Var1)))
out <- do.call(merge, lapply(myList, fz))
ऊपर रिटर्न बहुविविध चिड़ियाघर श्रृंखला है, जिसमें "कई बार" "a"
, "ago"
, आदि कर रहे हैं लेकिन एक डेटा अगर फ्रेम परिणाम वांछित थे तो यह सिर्फ as.data.frame(out)
का मामला था।
2. घटाएं। यहां दूसरा समाधान है। यह आर
की
merge1 <- function(x, y) merge(x, y, by = 1, all = TRUE)
out <- Reduce(merge1, lapply(myList, as.data.frame, stringsAsFactors = FALSE))
# optionally add nice names
colnames(out)[-1] <- paste("t", seq_along(myList), sep = "")
3. xtabs कोर में Reduce
उपयोग करता है। यह एक सूची में नाम कहते हैं और फिर आवृत्तियों, नाम और एक लंबी वेक्टर प्रत्येक उन्हें वापस डाल के रूप में समूहों के अर्क एक साथ xtabs
का उपयोग कर:
names(myList) <- paste("t", seq_along(myList))
xtabs(Freq ~ Names + Group, data.frame(
Freq = unlist(lapply(myList, unname)),
Names = unlist(lapply(myList, names)),
Group = rep(names(myList), sapply(myList, length))
))
बेंचमार्क
rbenchmark का उपयोग कर समाधान के कुछ बेंचमार्किंग पैकेज हमें निम्न मिलता है जो इंगित करता है कि चिड़ियाघर समाधान नमूना डेटा पर सबसे तेज़ है और तर्कसंगत रूप से सबसे सरल भी है।
> t1<-table(strsplit(tolower("this is a test in the event of a real word file you would see many more words here"), "\\W"))
> t2<-table(strsplit(tolower("Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal"), "\\W"))
> t3<-table(strsplit(tolower("Ask not what your country can do for you - ask what you can do for your country"), "\\W"))
> myList <- list(t1, t2, t3)
>
> library(rbenchmark)
> library(zoo)
> names(myList) <- paste("t", seq_along(myList), sep = "")
>
> benchmark(xtabs = {
+ names(myList) <- paste("t", seq_along(myList))
+ xtabs(Freq ~ Names + Group, data.frame(
+ Freq = unlist(lapply(myList, unname)),
+ Names = unlist(lapply(myList, names)),
+ Group = rep(names(myList), sapply(myList, length))
+))
+ },
+ zoo = {
+ fz <- function(x) with(as.data.frame(x, stringsAsFactors=FALSE), zoo(Freq, Var1))
+ do.call(merge, lapply(myList, fz))
+ },
+ Reduce = {
+ merge1 <- function(x, y) merge(x, y, by = 1, all = TRUE)
+ Reduce(merge1, lapply(myList, as.data.frame, stringsAsFactors = FALSE))
+ },
+ reshape = {
+ freqs.list <- mapply(data.frame,Words=seq_along(myList),myList,SIMPLIFY=FALSE,MoreArgs=list(stringsAsFactors=FALSE))
+ freqs.df <- do.call(rbind,freqs.list)
+ reshape(freqs.df,timevar="Words",idvar="Var1",direction="wide")
+ }, replications = 10, order = "relative", columns = c("test", "replications", "relative"))
test replications relative
2 zoo 10 1.000000
4 reshape 10 1.090909
1 xtabs 10 1.272727
3 Reduce 10 1.272727
जोड़ा गया: दूसरा समाधान।
जोड़ा गया: तीसरा समाधान।
जोड़ा गया: बेंचमार्क।
ओह प्रतीक्षा करें, मेरे उत्तर में मैंने माना है कि आप प्रत्येक तालिका के लिए एक अलग डेटा.फ्रेम कॉलम चाहते थे .. क्या आप उससे अलग प्रारूप के बाद थे? –