簡體   English   中英

如何在R中通過數據幀的字符串向量運行for循環?

[英]How to run a for-loop through a string vector of a data frame in R?

我正在嘗試做一些非常簡單的事情:通過名稱向量運行循環並在我的代碼中使用這些名稱。

geo = c(rep("AT",3),rep("BE",3))
time = c(rep(c("1990Q1","1990Q2","1990Q3"),2))
value = c(1:6)
Data <- data.frame(geo,time,value)

我的真實數據集有14個國家和75個時期。 我想找到一個函數,例如循環遍歷各個國家/地區,然后對它們進行子集,以便我擁有單個數據集,例如:

data_AT <- subset(Data, (Data$geo=="AT"))
data_BE <- subset(Data, (Data$geo=="BE"))

但有一個循環,理想情況下我可以應用於其他功能的解決方案:-)

在我看來,這應該是這樣的:

codes <- unique(Data$geo)
for (i in 1:length(codes))
{k <- codes[i]
data_(k) <- subset(Data, (Data$geo==k))}

但是子集不能像這樣工作,其他功能也沒有。 我認為我的問題是我不知道如何解決“k”所采用的相應名稱(例如“AT”)作為我的代碼的一部分。 如果可能的話,我非常感謝能夠通過包含文本的向量運行函數並在代碼中使用該向量的每個元素的一般解決方案的答案。 也許在應用函數的方向? 雖然我也沒有走得那么遠......

任何幫助將非常感謝!

在R中,通常使用data.frames list而不是幾個單獨的data.frames來執行此操作:

lst <- split(Data, Data$geo)
lst
#$AT
#  geo   time value
#1  AT 1990Q1     1
#2  AT 1990Q2     2
#3  AT 1990Q3     3
#
#$BE
#  geo   time value
#4  BE 1990Q1     4
#5  BE 1990Q2     5
#6  BE 1990Q3     6

現在,您可以通過鍵入以下內容來訪問每個元素(這是一個data.frame):

lst[["AT"]]
#  geo   time value
#1  AT 1990Q1     1
#2  AT 1990Q2     2
#3  AT 1990Q3     3

如果您有一個國家/地區名稱向量,您要為其向值列添加+1,則可以這樣執行:

cntrs <- c("BE", "AT")
lst[cntrs] <- lapply(lst[cntrs], function(x) {x$value <- x$value + 1; return(x)} )
#$BE
#  geo   time value
#4  BE 1990Q1     5
#5  BE 1990Q2     6
#6  BE 1990Q3     7
#
#$AT
#  geo   time value
#1  AT 1990Q1     2
#2  AT 1990Q2     3
#3  AT 1990Q3     4

編輯:如果你真的想堅持使用for循環,我建議不要將數據拆分成幾個單獨的data.frames,而是像這樣在整個數據集上運行循環,例如:

cntrs <- "BE"  

for(i in cntrs){
   Data$value[Data$geo == i] <- Data$value[Data$geo == i] + 1
}

我也使用循環用於simiral目的。 也許這不是最快的方式,但至少我理解它 - 例如,在保存不同子集的圖時。

沒有必要遍歷向量的長度,您可以循環遍歷向量本身。 要將字符串轉換為變量名,可以使用assign。

geo = c(rep("AT",3),rep("BE",3))
time = c(rep(c("1990Q1","1990Q2","1990Q3"),2))
value = c(1:6)
Data <- data.frame(geo,time,value)

codes <- sort(unique(Data$geo))
for (k in codes) {
 name<-paste("data", k, sep="_")
 assign(name, subset(Data, (Data$geo==k)))
}

順便說一句,從包dplyr過濾比子集快得多!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM