2017-03-07 27 views
0

假設我有幾個數據,並且我想分別對它們進行子集化。找不到對象使用r進行子集化時發生錯誤

n = c(1, 1, 1) 
s = c(55, 56, 57) 
q = c(99, 100, 101) 
df_1 = data.frame(n, s, q) 
df_2 = data.frame(n, s, q) 
df_3 = data.frame(n, s, q) # assume they are the same. 

    n s q 
1 1 55 99 
2 1 56 100 
3 1 57 101 

然後,我創建一個循環來調用該文件,

for (h in 1:3){ # for loop the file 
    for (i in 1:1){ # i is for different values in column 'n' 

    Result <- paste('ResultFile_',h,sep="") 
    input <- paste('df_',h,sep="") 

    Result <- subset(input,subset=n==i)[,c(2,3)] 

DO SOMETHING HERE.... 

} 
} 

我想到的是,當列「N」等於1時,我會列S和Q這將產生3個結果文件對我來說。

但它帶有錯誤信息。

Error in subset.default(input, subset = n == i) : object 'n' not found 

當我直接替換「輸入」在這一行subset(input,subset=n==i)[,c(2,3)]「DF1」,那麼它可以工作。

爲什麼?

+3

在你的例子中'輸入'是你用'paste()'(用class(input)'驗證)所做的一個字符串。 'subset'需要你傳入一個data.frame。如果你有一堆名爲'df_1','df_2','df_3'的變量,這通常表明你在R中「出錯了」。你的data.frames應該放在一個列表中,以使它更容易。看到這個問題更好的解決方案:http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames – MrFlick

回答

2

可以使用get函數傳遞字符串來調用對象。你可以嘗試這樣的事情:

input <- get(paste("df_", h, sep = "")) 

現在input是相同的數據幀df_1,而不是字符串"df_1"。順便說一下,如果您想要通過多個數據幀應用功能,可以創建一個所有數據幀的列表,然後使用lapply來應用該功能。例如,如果你想子集所有的數據幀,如果s == 56

data_list <- list(df_1, df_2, df_3) 
data_list2 <- lapply(data_list, subset, subset = s == 56) 

所有結果數據幀現在存儲在data_list2

+0

感謝您的'get'方法,它工作正常,@ ycw,但是如何同時創建多個'ResultFile_'文件? (在我的情況下是3個結果文件)。 – BigSecrect

+1

您可以使用'mget'在'list'中創建多個數據集。 – akrun

+1

@BigSecrect,您可以嘗試'assign'函數。例如,使用'subset'創建Result數據框後,添加如下代碼:assign(paste('ResultFile_',h,sep =「」),Result)'。 – www

相關問題