计算机语言VLOOKUP,R下如何实现VLOOKUP函数功能
原標題:R下如何實現VLOOKUP函數功能
緣起:
當我懷著對周末生活的美好憧憬等待下班的時候,突然領導拿著N份Excel表要求將上面的數據按月匯總到另一張Excel表中(匯總表格如題圖)。也許領導也知道工作量不小,臨走時留一下句:“辛苦一下,加加班,周一給我!”嘴上機械的回道:“好的”,心里羊駝狂奔,腦中各種處理方法快速閃過,最后定格在“VLOOKUP函數”。作為Excel中最強大的函數之一 ,vlookup果然不負重望,完美地匯總了數據,關鍵保住準時下班。
我的問題 Excel的vlookup那么強大,在R中能實現嘛?
我的嘗試 在《R語言實戰》的第四章-4.9.1 添加列(P76)提到 merge() 函數可以根據一個或多個共有變量把兩個數據框聯結起來。可是實踐結果(如下圖)告訴我,merge()函數是行不通的。因為兩個數據框中變量Month的觀測量不一致,所以聯結的結果以觀測量少的數據框準把部分Month丟掉了。
有問題找谷哥,關鍵詞:how to vlookup in r
很給力,第一個結果就給出了四種解決方案
但很遺憾,似乎R中的“Vlookup()函數”就是merge()函數,難道共有變量的觀測數就一定要相同嘛?在反復閱讀搜索結果后,發現了特別說明,找到了希望:
sqldf()效果還不錯,Month都留下了(如下圖),但NA怎么處理呢?Excel中Ctrl+H,可以輕松用任意字符把NA 替換掉
量重編碼)可以實現NA替換為“0”。
實踐進階 既然myframesqldf[2][is.na(myframesqldf[2])]
結果并不理想,與sqldf()做出的完全不同。什么原因呢?是兩個數據框的共有變量的觀測數不一致嘛??還是兩個向量不能直接進行比較呢?或者說兩個向量的運算規則是什么樣的?用paste()函數做一下實驗(《R語言實戰》P90)
不難看出,兩個向量的運算是可以進行比較等運算的,但其運算規則并不是我之前想象那樣,某個向量的每一個觀測與另一個向量的每一個觀測進行運算,而是以觀測數大的向量為線索,觀測數小的向量按自身順序循環進行運算。為了實現某個向量的每一個觀測與另一個向量的每一個觀測進行運算,我想到了for()函數。
結果和Excle的VLookup完全一致。
我的代碼:
##待匯總數據準備
zs
ls
ww
cy
le
tb
Month
myframe
#sqldf包法 ps: install.packages("sqldf")
library(sqldf)
data.frame( Month=as.character( Month),stringsAsFactors = FALSE)
myframe1
names(myframe1)[ 2]
myframesqldf[ 2][is.na(myframesqldf[ 2])]
##雙for()函數法
for(i in1:length(zs $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==zs $Month[i])myframe $zs[j]
for(i in1:length(ls $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==ls $Month[i])myframe $ls[j]
for(i in1:length(ls $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==ww $Month[i])myframe $ww[j]
for(i in1:length(ls $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==cy $Month[i])myframe $cy[j]
for(i in1:length(ls $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==le $Month[i])myframe $le[j]
for(i in1:length(ls $Month)){ for(j in1:length(myframe $Month)){ if(myframe $Month[j]==tb $Month[i])myframe $tb[j]
##單for()函數法
for(i in1:length(zs $Month)){myframe $zs[myframe $Month==zs $Month[i]]
for(i in1:length(ls $Month)){myframe $ls[myframe $Month==ls $Month[i]]
for(i in1:length(ww $Month)){myframe $ww[myframe $Month==ww $Month[i]]
for(i in1:length(cy $Month)){myframe $cy[myframe $Month==cy $Month[i]]
for(i in1:length(le $Month)){myframe $le[myframe $Month==le $Month[i]]
for(i in1:length(tb $Month)){myframe $tb[myframe $Month==tb $Month[i]]
感謝:
謝謝您花時間讀到這里,尤其是作出評論的親。數據分析學習之路,有您真好!
kaolixin,天善智能社區專家。
Blog:https://ask.hellobi.com/blog/kaolixin
微課推薦:(閱讀原文報名)返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的计算机语言VLOOKUP,R下如何实现VLOOKUP函数功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础案例 饲养员喂养动物
- 下一篇: 面对新时代挑战,2019维谛技术峰会全面