我有一个数据框:
Start <- data.frame("Number" = 2,"Square" = 4,"Cube" = 8)
输入向量:
Numbers <- c(3,5)
我想迭代Squarecube函数中Numbers的元素,并用结果填充数据框:
SquareCube <- function(x){ df <- c(x^2,x^3)
df}
所需的输出:
Filled <- data.frame("Number" = c(2,3,5),"Square" = c(4,9,25),"Cube" = c(8,27,125))
注意:已经搜索了该主题,但是在这种情况下,矢量数字的大小可以不同。我的意图是用函数的结果填充数据框。
谢谢
答案 0 :(得分:1)
如果我没看错您的问题,则可能是do.call
可能会提供帮助的结构问题。我还稍微重新定义了该函数以适应命名:
Start <- data.frame("Number" = 2,"Square" = 4, "Cube" = 8)
Number <- c(3,5)
定义您的功能:
SquareCube <- function(x){ list(Number=x,Square=x^2,Cube=x^3) }
然后构建具有所需最终结果的数据框:
> rbind(Start, data.frame( do.call(cbind, SquareCube(Number)) ))
Number Square Cube
1 2 4 8
2 3 9 27
3 5 25 125
您还可以创建包装函数,然后将Start
数据和要处理的原始Number
列表交给它,这将产生一个数据帧:
> makeResults <- function(a, b) { rbind(a, data.frame(do.call(cbind,SquareCube(b)))) }
> makeResults(Start, Number)
Number Square Cube
1 2 4 8
2 3 9 27
3 5 25 125
答案 1 :(得分:1)
outer()
函数产生的矩阵输出与您的输出完全相同。您可以将其更改为数据框并重命名。
(Filled <- outer(
c(2, 3, 5),
1:3,
FUN = "^"
))
#> [,1] [,2] [,3]
#> [1,] 2 4 8
#> [2,] 3 9 27
#> [3,] 5 25 125
对于此矩阵,您可以使用任何已知的功能
例如dplyr::rename()
:
library(tidyverse)
Filled %>%
as_tibble() %>% # make data frame
rename(Number = V1, Square = V2, Cube = V3) # rename column names
#> # A tibble: 3 x 3
#> Number Square Cube
#> <dbl> <dbl> <dbl>
#> 1 2 4 8
#> 2 3 9 27
#> 3 5 25 125