我正在尝试执行以下操作:
例如,假设该函数是将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列。我该怎么做呢?
请注意:我不想创建一个包含所有虹膜的元对象。
答案 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。