2016-08-21 28 views
2

我有一个数据框的列表,我试图添加一个矢量的相应元素作为所有观察值的新变量到列表的每个数据帧。添加一个新的列到数据框的列表,但只选择一个矢量的一行

我的问题是:是否有某种“索引”跟踪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 
+0

注意'lapply()'*是*循环。 – gung

回答

1

我们可以使用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,在map2purrr可能是有用的,以及

library(purrr) 
dfs %>% 
    map2(time, ~cbind(.x, timevar=.y)) 
+0

在我的例子中像魅力一样工作,但我也得到'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

+0

@Susu你有'dfs'的'长度'等于'时间'的长度。看起来你有'时间'作为data.farme'所以使用'Map(cbind,dfs,timevar = time $ time)' – akrun

+1

太好了,你懂了! '长度(时间)'确实是1.在使用't(时间)'后它起作用了!非常感谢!编辑:'时间$时间作品'以及。 – Susu

1

这是怎么回事?

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

感谢您的评论,这在示例中很有用。 Hower在我的真实数据中我得到'Data.frame中的错误(...,check.names = FALSE): 参数意味着行数不同:21,23',而'23'是'时间长度' 21'是我的第一个数据框中的观察次数。我不确定为什么我会得到这样的错误,但对我来说这没有意义,因为从时间上的价值只是一个数字呢? (我试图编辑示例以更好地匹配我的数据,但您的解决方案仍然可以在那里使用)。有任何想法吗? – Susu

+0

感谢您的帮助! Akrun已经解决了它,所以你不需要考虑它。 – Susu

相关问题