我正在使用列表,我想循环变量几次,但我不能。
这是一个例子:
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)
}
答案 0 :(得分:1)
我们可以将seq_along
与lapply
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")