1. 程式人生 > >R語言︱list用法、批量讀取、寫出資料時的用法

R語言︱list用法、批量讀取、寫出資料時的用法

列表是一種特別的物件集合,它的元素也由序號(下標)區分,但是各元素的型別可 以是任意物件,不同元素不必是同一型別。元素本身允許是其它複雜資料型別,比如,列表 的一個元素也允許是列表。例如:
> rec <- list(name="李明", age=30, scores=c(85, 76, 90))
> rec
$name
[1] "李明"
 
$age
[1] 30
 
$scores
[1] 85 76 90
列表元素總可以用“列表名[[下標]]”的格式引用。例如:
> rec[[2]]
[1] 30
> rec[[3]][2]
[1] 76


修改列表

列表的元素可以修改,只要把元素引用賦值即可。如:> rec$age <- 45甚至> rec$age <- list(19, 29, 31)(可以任意修改一個列表元素)。如果被賦值的元素原來不存在,則列表延伸以包含該新 元素。

提取某List某指標

方法一:
先編寫一個提取list子集的函式:

  1. subdate<- function(x){
  2. x$DATE
  3. }
複製程式碼
然後用lapply或者sapply
sapply(s,subdate)
看一下出來的結果

方法二:
提取DATE內容:
  1. s[[1]]$DATE
複製程式碼
變動其中的數字,就可以把每一組的DATE提取出來了。
(需要自己編寫迴圈)

參考於:http://bbs.pinggu.org/thread-3410181-1-1.html

方法三:提取長度大於某程度的list

x[lapply(x, length)>100]
用lapply計算每個x的長度。

list之間的合併

list之間的合併用:

c(list(1),list(2))


——————————————————————————————————————————————————————————————————————

unlist與list的區別

unlist(x)生成一個包含x所有元素的向量。作用是,展平資料列表。
unlist把l.ex[1]=unlist(l.ex)[1]+unlist(l.ex)[2],一拆為二。
> ##unlist是啥??
> l.ex <- list(list(1:5, LETTERS[1:5]), list("Z","A"),  NA)
> #list資料[]與[[]]是一樣的
> l.ex[2]
[[1]]
[[1]][[1]]
[1] "Z"

[[1]][[2]]
[1] "A"


> l.ex[[2]]
[[1]]
[1] "Z"

[[2]]
[1] "A"

> 
> #unlist把l.ex[1]的元素拆開了,分為unlist[1]+unlist[2]
> unlist(l.ex, recursive = FALSE)[3]
[[1]]
[1] "Z"

> unlist(l.ex, recursive = FALSE)[[3]]
[1] "Z"

————————————————————————————————————————————————————————————————

list在批量讀取、寫出xlsx資料時的用法

方法弊端:弊端就是迴圈語句的弊端,匯入的原始資料每個sheet都需要相同的資料結構。

list在批量讀取資料時候的用法,一開始筆者困惑在:

1、如何迴圈讀取xlsx中的sheet資料,然後批量放入list之中?——先定義list

2、如何定義寫出時候的檔名字——paste函式

批量讀取的基本流程就是:寫入(list[[i]])、操作、寫出

#1、讀取xlsx中所有的sheet表格
#如果像vector一樣定義List??——list()函式來主動定義,用data.list[[i]]來賦值
data.list<-list()
for (i in 1:2){
  data.list[[i]]=read.xlsx("C1.xlsx",i)
}
以上是寫入,看看如何寫出:
#3、利用List批量讀出操作
#難點:如果構造輸出表格的名稱——paste來構造名稱
flie=list()
xlsxflie=paste(1:2,".xlsx",sep="")

for(i in 1:2){
flie[[i]]=paste("C:/Users/long/Desktop/",xlsxflie[i],sep="")
write.xlsx(data.list2[[i]],file)
}
寫出時候檔名稱困擾我很久,如何按照一定的規則來命名,可以先用paste弄好固定格式,然後通過paste[i]迴圈呼叫。
其中:paste之後會有如vector一般的格式,可以用[i]來呼叫。

————————————————————————————————————————————————————————————————

list中的字串型資料如何匯出?

list是大規模資料操作非常優秀的方式,能夠存放非結構化的文字資料。但是如果,文字分好詞之後的資料(如下圖),如何將存放在list中的資料進行匯出呢?

[[1]]
        n         v        en         n      
   "職位"    "描述" "Android"    "平臺"    
   
[[2]]
           n            v            n         
      "崗位"       "描述"       "前端"      
筆者想辦法的幾種方式:

unlist->變成向量

data.frame->變成序號+單詞

as.chacter->單個文字

#list中的字串型資料如何匯出?

#list中非一般的字串形式
[[1]]
n         v        en         n      
"職位"    "描述" "Android"    "平臺"    

[[2]]
n            v            n         
"崗位"       "描述"       "前端"     

#1、unlist與list區別
Job_Pwordseg.ct[1][1]        #不論如何都不能得到list中的單個單詞
unlist(Job_Pwordseg.ct[1])[1]#可以得到單個單詞,向量形式

#2、data.frame法,批量處理時,因為不等長而無法合併
data.frame(Job_Pwordseg.ct[1])          #變成了序號+單詞
data.frame(unlist(Job_Pwordseg.ct[1]))  #跟list一樣的結果

#3、as.character
as.character(unlist(Job_Pwordseg.ct[1]))
#[1] "職位"    "描述"    "Android" "平臺"    "進行"    "手機"
as.character(Job_Pwordseg.ct[1])
#[1]"c(\"職位\", \"描述\", \"Android\", \"平臺\", \"進行\")

變換得到了資料之後,又出現了問題:

如何將list中那麼子集合並?——不等長合併

兩種方法:c(),可以將list[1] 和list[2]進行直接合並,可以相容不等長,當然合併之後,還有list檔案;

rbind.fill函式,不等長合併函式,在plyr包中。

#4、t()在list的文字型
t(data.frame(Job_Pwordseg.ct[1]))
#A [,1]   [,2]   [,3]
#"職位" "描述" "Android"
data.frame(t(data.frame(Job_Pwordseg.ct[1])))
#A [,1]   [,2]   [,3]
#職位    描述   Android

#4、list中字元的合併用c
c(Job_Pwordseg.ct[1],Job_Pwordseg.ct[2])
不等長合併的時候,rbind.fill函式可以很好將資料進行合併,並且補齊沒有匹配到的缺失值為NA。
#如何解決合併時資料不等長問題——兩種方法:do.call函式以及rbind.fill函式(plyr包)
#rbind.fill函式只能合併資料框格式
#do.call函式在資料框中執行函式(函式,資料列)
library("plyr")  #載入獲取rbind.fill函式
#第一種方法
list1<-list()
list1[[1]]=data.frame(t(data.frame(Job_Pwordseg.ct[1])))
list1[[2]]=data.frame(t(data.frame(Job_Pwordseg.ct[2])))
do.call(rbind.fill,list1)
#第二種方法
u=rbind.fill(data.frame(t(data.frame(Job_Pwordseg.ct[1]))),data.frame(t(data.frame(Job_Pwordseg.ct[2]))))


得到了資料之後,資料量小的話,很容易讀寫,但是資料量大的話,很難做到那麼順暢。當然,為什麼要匯出呢——因為要傳給別的隊友。。。

可以有兩種辦法:

1、批量寫出,批量讀入;

2、寫寫成一個data,然後匯出,再寫入。

#讀寫函式用write.table、read.table+t()
write.table(u,"C:/Users/long/Desktop/3.txt")
t(read.table("C:/Users/long/Desktop/3.txt"))
#分隔符sep=""(空格、製表符、回車),"\n"(引號),"\t"(製表符分隔符中有空格)
#字元型欄位中,自帶空格,則使用引數 strip.white=TRUE

#方法一:單檔案匯出,後批量匯入

#方法二:先合成一個文字匯出,再匯入

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~