我有一个数据帧列表,所有数据帧都包含一个用户列和另一个称为“ 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”
感谢您的帮助!
答案 0 :(得分:1)
我们可以使用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
的逻辑返回'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