[英]In R, use the ls() function with a regular expression to save only character objects?
我創建了 100 多個對象,每個對象都是由兩部分組成的字符串。 他們都以等號開始第一部分,例如,
intro <- c("=intro", "For calendar year 2007 blah blah.")
str(intro)
chr [1:2] "=intro" ...
我的目標是將所有這些對象組合到一個數據框中,該數據框包含第一部分,第一列中以“=”開頭,第二列中包含一個或多個句子。
要將所有對象保存為數據框:
character.objects <- data.frame(chrobjects = ls(), stringsAsFactors = FALSE)
有沒有辦法使用 ls 函數的 pattern = 參數,以便只有 chr [1:2] 對象保存在 character.objects 數據框中? 或者,我還能如何實現我的目標?
首先,創建一堆這樣的變量可能不是一個好的設計策略。 很可能這些值應該組合成一個列表或其他東西。 但是找到所有這些變量的名稱的一種方法是
whatIwant<-function(x) {
z <- get(x)
if (is.character(z)) {
if (length(z)==2) {
if (substr(z[1],1,1)=="=")
return(TRUE)
}
}
return(FALSE)
}
myvars <- Filter(whatIwant, ls())
因此ls()
返回一個字符向量,其中包含工作區中所有對象的名稱。 我使用Filter
將該列表縮減為僅我們感興趣的名稱。我編寫了自定義函數whatIwant
來幫助查找這些值。
輔助函數使用來自ls()
的名稱,然后通過get()
實際獲取對象。 然后我們檢查類、長度和值以確保它符合您的標准。 所以myvars
應該是一個字符向量,只有與您的描述匹配的變量的名稱
然后我們可以將變量名稱的向量轉換為一個包含它們的值的 data.frame,類似於
do.call(rbind, lapply(mget(myvars), function(x) data.frame(key=x[1], val=x[2])))
或者可能
myvals <- mget(myvars)
data.frame(key=sapply(myvals, `[`, 1), val=sapply(myvals, `[`, 2))
請注意,此解決方案不使用ls()
函數的pattern=
參數,因為該參數僅適用於對象的名稱,而不適用於對象本身的內容或類型。
你也可以試試。
創建一些數據
intro <- c("=intro", "For calendar year 2007 blah blah.")
intro1 <- c("intro", "For calendar year 2008 blah blah.")
intro2 <- c("intro=", "For calendar year 2009 blah blah.")
intro3 <- c("=intro", "For calendar year 2010 blah")
library(stringr)
res <- do.call(rbind, lapply(mget(ls())[sapply(mget(ls()), is.character)], function(x) {
x1 <- x[str_detect(x, perl("(?<=^=)[[:alnum:]]+"))[1]]
if (length(x1) > 0)
data.frame(key = x1[1], val = x1[2], stringsAsFactors = F)
}))
res
# key val
#intro =intro For calendar year 2007 blah blah.
#intro3 =intro For calendar year 2010 blah
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.