Как исправить использование «гнезда», чтобы вызвать список столбца списка? - PullRequest
0 голосов
/ 23 января 2019

Я работаю с базовым фреймом данных, который содержит некоторую информацию, эта информация используется для генерации нового столбца, который является фреймом данных.

Я попытался использовать функцию map2, но результаты не очень хорошие, чем ближе результаты к тому, что я ожидаю, используя функцию nest и tibble из пакета purrr.

library(tidyverse)
library(dplyr)
library(purrr)
library(RcppRoll)

dfBase <- data.frame(id = sample(letters[1:3], 3, replace = TRUE),
              dat1 = rnorm(n = 3, 1, 1),
              dat2 = rnorm(n = 3, 2, 1))
View(dfBase)

dfOperations <- function(dat1, dat2){
Sum  = dat1+dat2
Rest = dat1-dat2
Mult = dat1*dat2
Div  = dat1/dat2

test <- tibble(
Opera = c('Sum','Rest','Mult','Div'),
Resul = c(Sum, Rest, Mult, Div))%>%nest()
} 

for (x in 1:nrow(dfBase)) {
dfBase$Result[x] <- dfOperations(dfBase$dat1[x],dfBase$dat2[x])
}


dfBase
str(dfBase)
View(dfBase$Result)

Когда новыйСтолбец генерируется как список, а не как список элементов.

'data.frame':   3 obs. of  4 variables:
$ id    : Factor w/ 2 levels "b","c": 1 1 2
$ dat1  : num  0.53 1.29 1.19
$ dat2  : num  0.915 2.844 1.052
$ Result:List of 3
..$ :List of 1
 .. ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  4 obs. of  2 variables:
 .. .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
 .. .. ..$ Resul: num  1.444 -0.385 0.484 0.579
 ..$ :List of 1
 .. ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  4 obs. of  2 variables:
 .. .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
 .. .. ..$ Resul: num  4.136 -1.552 3.675 0.454
 ..$ :List of 1
 .. ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  4 obs. of  2 variables:
 .. .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
 .. .. ..$ Resul: num  2.246 0.143 1.256 1.136

Как удалить или исключить Список 1, оставив только второй список Opera and Resul?

1 Ответ

0 голосов
/ 23 января 2019

Попробуйте получить доступ к выводу dfOperations с [[1]] для каждой итерации цикла:

for (x in 1:nrow(dfBase)) {
dfBase$Result[x] <- dfOperations(dfBase$dat1[x],dfBase$dat2[x])[[1]]
}

'data.frame':   3 obs. of  4 variables:
 $ id    : Factor w/ 3 levels "a","b","c": 1 3 2
 $ dat1  : num  0.849 2.659 0.862
 $ dat2  : num  2.45 1.15 1.35
 $ Result:List of 3
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':        4 obs. of  2 variables:
  .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
  .. ..$ Resul: num  3.301 -1.603 2.082 0.346
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':        4 obs. of  2 variables:
  .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
  .. ..$ Resul: num  3.81 1.51 3.06 2.31
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':        4 obs. of  2 variables:
  .. ..$ Opera: chr  "Sum" "Rest" "Mult" "Div"
  .. ..$ Resul: num  2.208 -0.484 1.16 0.64
...