添加一个新的列到数据框的列表,但只选择一个矢量的一行
我有一个数据框的列表,我试图添加一个矢量的相应元素作为所有观察值的新变量到列表的每个数据帧。添加一个新的列到数据框的列表,但只选择一个矢量的一行
我的问题是:是否有某种“索引”跟踪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
我们可以使用Map
通过cbind
荷兰国际集团与在“时间”矢量的元素“DFS”相应list
元素来创建一个“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
从purrr
可能是有用的,以及
library(purrr)
dfs %>%
map2(time, ~cbind(.x, timevar=.y))
在我的例子中像魅力一样工作,但我也得到'Data.frame中的错误(...,check.names = FALSE): 参数意味着不同的行数:21,23'我真的很确定它源于此'> str(time) 'data.frame':\t 23 obs。 1变量: $ time:int 2 1 2 1 2 1 1 2 2 2 ... > str(dfs [[1]]) 'data.frame':\t 21 obs。 188个变量:“但是从我的理解来看,他们不一定是一样的长度吗? – Susu
@Susu你有'dfs'的'长度'等于'时间'的长度。看起来你有'时间'作为data.farme'所以使用'Map(cbind,dfs,timevar = time $ time)' – akrun
太好了,你懂了! '长度(时间)'确实是1.在使用't(时间)'后它起作用了!非常感谢!编辑:'时间$时间作品'以及。 – Susu
这是怎么回事?
lapply(seq_len(length(dfs)),function(t) cbind(dfs[[t]],time[t]))
注意'lapply()'*是*循环。 – gung