Заполнение фрейма данных циклами - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть датафрейм:

Start <- data.frame("Number" = 2,"Square" = 4,"Cube" = 8)

Вектор ввода:

Numbers <- c(3,5)

Я хочу перебрать элементы Numbers в функции Squarecube и заполнить фрейм данных результатами:

 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 голосов
/ 05 ноября 2018
Функция

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
0 голосов
/ 02 ноября 2018

Если я правильно понял ваш вопрос, у вас могут быть проблемы со структурой, с которыми 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...