我有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循环做了些什么。任何指导/教学将不胜感激。谢谢!
答案 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