用循环填充数据框

时间:2018-10-31 21:51:16

标签: r loops dataframe

我有一个数据框:

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

注意:已经搜索了该主题,但是在这种情况下,矢量数字的大小可以不同。我的意图是用函数的结果填充数据框。

谢谢

2 个答案:

答案 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

对于此矩阵,您可以使用任何已知的功能

  1. 更改班级
  2. 更改列名

例如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