R語言︱list用法、批量讀取、寫出資料時的用法
阿新 • • 發佈:2018-12-31
列表是一種特別的物件集合,它的元素也由序號(下標)區分,但是各元素的型別可 以是任意物件,不同元素不必是同一型別。元素本身允許是其它複雜資料型別,比如,列表 的一個元素也允許是列表。例如:
然後用lapply或者sapply
sapply(s,subdate)
看一下出來的結果
方法二:
提取DATE內容:
變動其中的數字,就可以把每一組的DATE提取出來了。
(需要自己編寫迴圈)
unlist把l.ex[1]=unlist(l.ex)[1]+unlist(l.ex)[2],一拆為二。
其中:paste之後會有如vector一般的格式,可以用[i]來呼叫。
變換得到了資料之後,又出現了問題:
> 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子集的函式:
- subdate<- function(x){
- x$DATE
- }
然後用lapply或者sapply
sapply(s,subdate)
看一下出來的結果
方法二:
提取DATE內容:
- 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~