R 使用data.table在数据帧列表上循环
我有3个数据帧,我想在它们上运行相同的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.
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()”是循环中遍历列表的标准吗?@moxedseq_-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