将R函数应用于多个对象并重写对象

时间:2017-03-07 01:34:16

标签: r

我正在尝试执行以下操作:

  • 定义一个函数,该函数根据数据框中的现有列创建附加列
  • 将所述函数应用于多个对象(数据帧),重写原始数据框

例如,假设该函数是将Petal.Length除以虹膜中的Petal.Width。

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

这部分很容易。

现在假设我有三(或三千)个虹膜数据帧:

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))

最终得到虹膜,iris2,iris4和iris5的新divvy列。我该怎么做呢?

请注意:我不想创建一个包含所有虹膜的元对象。

1 个答案:

答案 0 :(得分:0)

我们可以使用 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)) 来执行此操作:

> 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

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

测试看起来像这样(只显示列表的前2个元素):

assign

编辑***响应OP更新问题规范:

你可以试试这个:

test

虽然我建议反对iris,特别是对很多对象。你可以从我在答案的前半部分制作的get列表中提取元素,你仍然可以得到相同的答案,只是更清洁,更简洁。

代码执行的操作是将x数据表作为字符串提取,然后使用divvied读取它们。这将传递给您的divvy函数,创建一个data.table {{1}}。然后我使用assign来创建带有后缀{{1}}的data.table。