如何在列表中循环变量名称

时间:2018-03-28 06:03:14

标签: r

我正在使用列表,我想循环变量几次,但我不能。

这是一个例子:

a=data.frame(ID=1:5,WT=1:5)  
b=data.frame(ID=101:105,WT=101:105)
c=list(a,b)
names(c)=c("P01","P02")

现在我想为每个数据框添加一个新列

c$P01$seq=1:length(c$P01$ID)  
c$P02$seq=1:length(c$P02$ID)

我得到的问题是我的列表有29个数据帧,而不是像这个例子中的两个。如何自动完成此过程,以便为每个数据框添加新列?

我尝试了一些没有成功的事情,比如创建一个循环,但它不起作用:

unique=names(c)
for (i in 1:length(unique) {
   c$unique[i]$seq=1:length(c$unique[i]$seq)  
}

2 个答案:

答案 0 :(得分:1)

我们可以将seq_alonglapply

一起使用
lapply(c, transform, Seq = seq_along(ID))

或使用tidyverse

library(tidyverse)
c %>% 
   map(~ .x %>% 
            mutate(Seq = row_number()))

答案 1 :(得分:0)

为什么for - 循环不起作用的原因是您使用character - 值与$ - 运算符结合使用。您可以通过使用[[索引列表来解决此问题。

df_names <- names(dfs)
for (i in seq_along(df_names)) {
  dfs[[df_names[i]]]$seq <- seq_along(dfs[[df_names[i]]]$ID)
}

此外,您可以在for - 循环中使用自己的名称:

for (x in df_names) {
  dfs[[x]]$seq <- seq_along(dfs[[x]]$ID)
}

数据
注意:由于c和unique是基础R中的两个函数,我在我的示例中更改了变量名称。

a <- data.frame(ID = 1:5, WT = 1:5)
b <- data.frame(ID = 101:105, WT = 101:105)
dfs <- list(a, b)
names(dfs) <- c("P01", "P02")