使用data.table

时间:2018-02-18 03:20:29

标签: 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.table)
dt = data.table(df1)
dt[grepl(pattern = "a", x = df1$col1),  col1 :=col2]

但是我试图让它在多个数据帧上运行时失败了:

df1 <- data.frame(col1 = c("a", "a", "b"), col2 = c("AA", "AA", "AA"))
df2 <- data.frame(col1 = c("b", "b", "a"), col2 = c("AA", "BB", "BB"))
df3 <- data.frame(col1 = c("b", "b", "b"), col2 = c("AA", "AA", "BB"))

library(data.table)
listdfs = list(df1, df2, df3)
for (i in dt[[]]) {
dt[[i]][grepl(pattern = "a", x = df[[i]]$col1), col1 := col2] }

但这显然不起作用,因为我不知道我对for循环做了些什么。任何指导/教学将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

如果我们循环遍历list,则循环遍历list的序列,然后执行作业

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]
 }

这会改变元素,即data {表格中的listdfs以及对象'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