R 使用data.table在数据帧列表上循环

R 使用data.table在数据帧列表上循环,r,for-loop,data.table,R,For Loop,Data.table,我有3个数据帧,我想在它们上运行相同的data.table函数。我可以为每个data.frame手动执行此操作,但我想学习如何更有效地执行此操作 使用data.table包,仅当col1包含“a”时,我想用col2的内容替换col1的内容。我想在三个不同的数据帧上运行这段代码。在单个data.frame上,这可以正常工作: df1 <- data.frame(col1 = c("a", "a", "b"), col2 = c("AA", "AA", "AA")) library(data.

我有3个数据帧,我想在它们上运行相同的
data.table
函数。我可以为每个
data.frame
手动执行此操作,但我想学习如何更有效地执行此操作

使用
data.table
包,仅当
col1
包含“a”时,我想用
col2
的内容替换
col1
的内容。我想在三个不同的数据帧上运行这段代码。在单个
data.frame
上,这可以正常工作:

df1 <- data.frame(col1 = c("a", "a", "b"), col2 = c("AA", "AA", "AA"))
library(data.table)
dt = data.table(df1)
dt[grepl(pattern = "a", x = df1$col1),  col1 :=col2]

df1如果我们在
列表
中循环,则在
列表
的顺序上循环,然后执行赋值

listdfs = list(df1, df2, df3)
lapply(listdfs, setDT) # change the `data.frame` to `data.table`
for (i in seq_along(listdfs)) { # loop over sequence
   listdfs[[i]][grepl(pattern = "a", x = col1), col1 := col2]
 }
这将更改
listdfs
中的元素,即data.table with,以及对象“df1”、“df2”、“df3”本身,因为我们没有创建任何
copy

df1
#   col1 col2
#1:   AA   AA  # change
#2:   AA   AA  # change
#3:    b   AA

df2
#   col1 col2
#1:    b   AA
#2:    b   BB
#3:   BB   BB   # change

df3
#   col1 col2
#1:    b   AA
#2:    b   AA
#3:    b   BB

这太棒了。非常感谢。“seq_-along()”是循环中遍历列表的标准吗?@moxed
seq_-along
可以用于
vector
/data.frame/data.table列、列表元素etc@moxed但是,通过循环运行data.tables/data.frames的标准是不通过循环运行它们。您可以使用
rbind
rbindlist
来获得一个表,这在Gregor答案的“合并”部分中进行了解释
df1
#   col1 col2
#1:   AA   AA  # change
#2:   AA   AA  # change
#3:    b   AA

df2
#   col1 col2
#1:    b   AA
#2:    b   BB
#3:   BB   BB   # change

df3
#   col1 col2
#1:    b   AA
#2:    b   AA
#3:    b   BB