将新列添加到数据框列表,但只选择向量的一行

时间:2016-08-21 13:15:53

标签: r

我有一个数据框列表,我正在尝试将向量的相应元素添加为所有观察到列表中每个数据框的新变量的值。

我的问题是:是否有某种“索引”可以跟踪lapply函数现在的步骤?我无法在此找到任何内容,但它会解决我的问题我相信因为我不需要循环而只能使用timevar <- time[magic.index]我认为该示例使我的意思更加清晰。

#list of data frames
df1 <- data.frame("Var1" = c(1:10))
df2 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10))
df3 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10),"Var3" = c(1:10))
dfs <- list(df1,df3,df2)

time <- c(1,2,1)

#this is what I want to do with lapply
lapply(dfs, function(x) within(x, timevar <- 1))

dfs2 <- for (i in seq_along(dfs)){
 lapply(dfs, function(x) within(x, timevar <- time))
}

#this is what the result should look like
dfs[[1]] <- within(dfs[[1]], timevar <- 1)
dfs[[2]] <- within(dfs[[2]], timevar <- 2)
dfs[[3]] <- within(dfs[[3]], timevar <- 1)
dfs

2 个答案:

答案 0 :(得分:1)

这个怎么样?

lapply(seq_len(length(dfs)),function(t) cbind(dfs[[t]],time[t]))

答案 1 :(得分:1)

我们可以使用Map通过cbind'dfs'中相应的list元素和'time'向量中的元素来创建'timevar'列。

Map(cbind, dfs, timevar = time)
#[[1]]
#   Var1 timevar
#1     1       1
#2     2       1
#3     3       1
#4     4       1
#5     5       1
#6     6       1
#7     7       1
#8     8       1
#9     9       1
#10   10       1

#[[2]]
#   Var1 Var2 Var3 timevar
#1     1    1    1       2
#2     2    2    2       2
#3     3    3    3       2
#4     4    4    4       2
#5     5    5    5       2
#6     6    6    6       2
#7     7    7    7       2
#8     8    8    8       2
#9     9    9    9       2
#10   10   10   10       2

#[[3]]
#   Var1 Var2 timevar
#1     1    1       1
#2     2    2       1
#3     3    3       1
#4     4    4       1
#5     5    5       1
#6     6    6       1
#7     7    7       1
#8     8    8       1
#9     9    9       1
#10   10   10       1

如果我们使用的是hadleyverse,那么来自map2的{​​{1}}也很有用

purrr