向列表中的所有数据框添加具有缩放值的新列

时间:2019-01-09 14:25:33

标签: r

我有一个数据帧列表,所有数据帧都包含一个用户列和另一个称为“ VD”的列。我想使用VD列的缩放值向列表中的所有数据框'VD_z'添加新列

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

我得到的是一条错误消息'如果(!is.null(names(x)))list(names(x),:(x,c(length(x),1L),   “数据”必须是向量类型,为“ NULL”

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我们可以使用map中的purrr来遍历listmutate来创建'VD_z'

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

或将base Rlapply/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的逻辑返回'df'

filelist1 <- lapply(filelist, function(df) {df$VD_z <- scale(df$VD); df})

答案 1 :(得分:1)

一种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