добавить новый столбец с масштабированными значениями ко всем кадрам данных в списке - PullRequest
0 голосов
/ 09 января 2019

У меня есть список фреймов данных, каждый из которых содержит столбец пользователя и еще один столбец с именем «VD». Я хочу добавить новый столбец ко всем фреймам данных 'VD_z' в списке с масштабированными значениями столбца VD

df1 <- data.frame(VD = 1:3, user=letters[1:3])
df2 <- data.frame(VD = 4:6, user=letters[4:6])
filelist <- list(df1,df2)

Я прочитал несколько похожих вопросов, наконец пытаясь:

filelist <- mapply(cbind(filelist, VD_z= lapply(filelist, function(df) scale(df$VD))))

Я ожидаю, что все кадры данных в списке теперь имеют новый столбец VD_z с масштабированными значениями, например:

df1 <- data.frame(VD = 1:3, user=letters[1:3], VD_z=c(-1,0,1))
df2 <- data.frame(VD = 4:6, user=letters[4:6], VD_z=c(-1,0,1))

Я получаю сообщение об ошибке 'Ошибка в массиве (x, c (length (x), 1L), if (! Is.null (names (x))) list (names (x),: 'data' должен быть векторного типа, был 'NULL'

Спасибо за вашу помощь!

Ответы [ 2 ]

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

A data.table подход может быть,

library(data.table)

dd <- rbindlist(filelist, idcol = 'id')[, VD_z := scale(VD), by = id]
#   id VD user VD_z
#1:  1  1    a   -1
#2:  1  2    b    0
#3:  1  3    c    1
#4:  2  4    d   -1
#5:  2  5    e    0
#6:  2  6    f    1

Затем вы можете использовать split(), чтобы разбить фрейм данных на список, т.е.

split(dd, dd$id)

, что дает,

$`1`
   id VD user VD_z
1:  1  1    a   -1
2:  1  2    b    0
3:  1  3    c    1

$`2`
   id VD user VD_z
1:  2  4    d   -1
2:  2  5    e    0
3:  2  6    f    1
0 голосов
/ 09 января 2019

Мы можем использовать map из purrr, чтобы пройти через list и mutate, чтобы создать 'VD_z'

library(tidyverse)
filelist %>%
      map( ~ .x %>% 
                mutate(VD_z = scale(VD)))

или использование base R с lapply/transform

filelist1 <- lapply(filelist, transform, VD_z = scale(VD))
filelist1
#[[1]]
#  VD user VD_z
#1  1    a   -1
#2  2    b    0
#3  3    c    1

#[[2]]
#  VD user VD_z
#1  4    d   -1
#2  5    e    0
#3  6    f    1

Если мы используем логику из OP's post, assign the масштаба to new coumn 'VD_z' and then return` 'df'

filelist1 <- lapply(filelist, function(df) {df$VD_z <- scale(df$VD); df})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...