簡體   English   中英

在 R 中,使用帶有正則表達式的 ls() 函數來僅保存字符對象?

[英]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.

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