【发布时间】:2019-03-04 12:18:19
【问题描述】:
我正在创建一个 R 脚本以从我的收件箱中提取某些电子邮件附件,将附件放入数据框(与文件名同名),然后将数据框名称解析为单个元素,然后可以使用在数据框中创建新列。然后这将被 rbind-ed 并最终放入 SQL 表中。
我正处于需要一个循环来遍历数据框名称、解析它们并将它们添加为新列的阶段,但我无法让我的循环工作。
我在下面提供了我的代码示例:
df_list <- Filter(function(x) is.data.frame(get(x)), ls())
for(i in df_list){
i["Filename"] <- df_list[i]
i["Campaign_ID"] <- sapply(strsplit(df_list[i], " "), "[", 1)
i["Campaign_Name"] <- str_sub(regmatches(df_list[i], regexpr("(?<=\\ )[^_]+", df_list[i], perl=TRUE)), start = 1, end = str_length(regmatches(df_list[i], regexpr("(?<=\\ )[^_]+", df_list[i], perl=TRUE))) - str_length(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^_]+", df_list[i], perl=TRUE)))-1)
i["Campaign_Code"] <- regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE))
i["Brand"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 1, stop = 4)
i["Campaign_Type"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 5, stop = 7)
i["Campaign_Category"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 8, stop = 10)
i["Campaign_Churn"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 11, stop = 13)
i["Product"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 14, stop = 16)
i["Version"] <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 17, stop = 17)
i["Segment"] <- regmatches(df_list[i], regexpr("(?<=\\_)[^ -]+", df_list[i], perl=TRUE))
i["Churn"] <- regmatches(df_list[i], regexpr("(?<=\\- )[^ -]+", df_list[i], perl=TRUE))
i["Stage"] <- regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^\\s]+", df_list[i], perl=TRUE))
i["Other"] <- str_sub(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^.]+", df_list[i], perl=TRUE)), start = str_length(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^\\s]+", df_list[i], perl=TRUE)))+2, end = str_length(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^.]+", df_list[i], perl=TRUE))) - str_length(regmatches(df_list[i], regexpr("\\S+(?=\\.[^.]*$)", df_list[i], perl=TRUE)))-1)
i["Date"] <- dmy(regmatches(df_list[i], regexpr("\\S+(?=\\.[^.]*$)", df_list[i], perl=TRUE)))
print(i)
}
我想这是我的循环中缺少的一些简单的东西,但我似乎无法弄清楚是什么。 我试过这个没有解析,只是添加随机数据,但它仍然不起作用
为清楚起见,我还提供了“df_list”的内容(这些确实是数据帧 - 它们的名称与它们所派生的文件的名称相同):
[1] "20579 Buzz Testing Nathan 1 BUZZRETJOUCHUALLA_D1A - Churned - Stage 1 Other 28-February-2019.csv"
[2] "20580 Buzz Testing Nathan 2 BUZZRETJOUCHUALLA_D1B - Churned - Stage 1 Other 28-February-2019.csv"
[3] "20581 Buzz Testing Nathan 3 BUZZRETJOUCHUALLA_D1C - Churned - Stage 1 Other 28-February-2019.csv"
编辑: 我想我会添加一些更多可重现的数据,这应该有助于澄清一些事情。
`20579 Buzz Testing Nathan 1 BUZZRETJOUCHUALLA_D1A - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 000000, Code = 'ABCDE')
`20580 Buzz Testing Nathan 2 BUZZRETJOUCHUALLA_D1B - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 111111, Code = 'FGHIJ')
`20581 Buzz Testing Nathan 3 BUZZRETJOUCHUALLA_D1C - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 222222, Code = 'KLMNO')
然后在每个数据框中,创建一个新列,使用数据框名称的元素来填充它们。 因此,例如,对于第一个数据框,数据框名称的前 5 位数字将是活动 ID。正如我的问题前面提到的,我已经对这些元素进行了字符串拆分。
【问题讨论】: