2017-03-07 37 views
0

我試圖執行以下操作:應用一個R函數到多個對象和重寫對象

  • 定義哪些在數據幀
  • 應用所述函數來創建一個基於現有的列的附加列的函數多個對象(數據幀),重寫原始數據幀

例如,說功能是將Petal.Length除以虹膜中的Petal.Width。

divvy <- function(mydataframe){mydataframe$divvy <- mydataframe$Petal.Length/mydataframe$Petal.Width} 

這部分很簡單。

現在想象一下,我有三個(或三千)虹膜dataframes:

iris2 <- iris 
iris4 <- iris 
iris5 <- iris 

我試圖避免的是:

iris <- divvy(iris) 
iris2 <- divvy(iris2) 
iris4 <- divvy(iris4) 
iris5 <- divvy(iris5) 

次無限的虹膜數據幀的數量我有

...沿線有東西

lapply(c(iris,iris2,iris4,iris4), function(x) divvy(x)) 

最終得到具有新divvy列的iris,iris2,iris4和iris5。我該怎麼做呢?

請注意:我不想創建一個包含所有虹膜的元對象。

回答

0

我們可以使用data.table做到這一點:

library(data.table)

divvy <- function(x){x[,divvy := Petal.Length/Petal.Width]} 

iris2 <- data.table(iris) 
iris4 <- data.table(iris) 
iris5 <- data.table(iris) 

test <- lapply(list(iris2,iris4,iris5), function(x) divvy(x)) 

如果測試看起來像這樣(只顯示列表中的第2個元素):

> test 
[[1]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species divvy 
    1:   5.1   3.5   1.4   0.2 setosa 7.000000 
    2:   4.9   3.0   1.4   0.2 setosa 7.000000 
    3:   4.7   3.2   1.3   0.2 setosa 6.500000 
    4:   4.6   3.1   1.5   0.2 setosa 7.500000 
    5:   5.0   3.6   1.4   0.2 setosa 7.000000 
---                  
146:   6.7   3.0   5.2   2.3 virginica 2.260870 
147:   6.3   2.5   5.0   1.9 virginica 2.631579 
148:   6.5   3.0   5.2   2.0 virginica 2.600000 
149:   6.2   3.4   5.4   2.3 virginica 2.347826 
150:   5.9   3.0   5.1   1.8 virginica 2.833333 

[[2]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species divvy 
    1:   5.1   3.5   1.4   0.2 setosa 7.000000 
    2:   4.9   3.0   1.4   0.2 setosa 7.000000 
    3:   4.7   3.2   1.3   0.2 setosa 6.500000 
    4:   4.6   3.1   1.5   0.2 setosa 7.500000 
    5:   5.0   3.6   1.4   0.2 setosa 7.000000 
---                  
146:   6.7   3.0   5.2   2.3 virginica 2.260870 
147:   6.3   2.5   5.0   1.9 virginica 2.631579 
148:   6.5   3.0   5.2   2.0 virginica 2.600000 
149:   6.2   3.4   5.4   2.3 virginica 2.347826 
150:   5.9   3.0   5.1   1.8 virginica 2.833333 

編輯* **迴應OP更新問題規格:

你可以試試這個:

for(i in c("iris2", "iris4", "iris5")){ 
    x <- divvy(get(i)) 
    assign(paste0(i,"divvied"), x) 
} 

雖然我建議反對assign,尤其是對於很多對象。你可以從test列表中提取我在答案的前半部分列出的元素,你仍然可以得到相同的答案,只是一點清潔劑,少一些混亂。

代碼的作用是將字符串iris拉到數據表中,然後使用get讀取它們。這是傳遞給你的分配函數,創建一個data.table x。然後我使用assign來創建後綴爲divvied的data.table。

+0

好的,我不清楚如何澄清我的問題,以清楚地說明問題:問題不在於定義函數,這是您的數據表實現很好地解決的問題。我實際上*詢問/嘗試解決的問題是不必生成新的測試對象,其中包含虹膜數據幀列表 - 我想修改虹膜。 – dvanic

+0

澄清問題中的措辭,試圖使這個更清晰 – dvanic

+0

這是否意味着您想要在您的環境中創建「無限」對象? –