除了编程之外,我对这个问题的正确方法感到迷茫。我有2个带有市场名称列的数据框。不幸的是,每列的名称在几个字符/符号之间变化,例如, Albany.Schenectady.Troy = ALBANY,Boston.Manchester = BOSTON。
我想在两个数据框中标准化市场名称,以便稍后执行merge
操作。
我想通过两个步骤解决问题: 1)从两个表创建唯一市场名称的向量,并使用它来创建查找表。看起来像:
表1市场> “Albany.Schenectady.Troy”,“Albuquerque.Santa.Fe”,“亚特兰大”。 。 。 。
表2市场> “SPOKANE”,“波士顿”。 。 。
我尝试marketnamesvector <- paste(unique(Table1$Market, sep = "", collapse = ","))
,但这不会产生所需的输出。
2)将表2中的市场名称更改为表1中的等效市场名称。对于表1中未提供的任何市场名称,表2应保留市场名称中的相同值。
我知道我可以使用类似下面的循环函数但我仍然需要一个查找表。
replacefunc <- function (data, oldvalue, newvalue) {
newdata <- data
for (i in unique(oldvalue)) newdata[data == i] <- newvalue[oldvalue == i]
newdata
}
表1:此表格为90行x 2列,有90个独特的市场名称。
Market Leads Investment Leads1 Leads2 Leads3
1 Albany.Schenectady.Troy NA NA NA NA NA
2 Albuquerque.Santa.Fe NA NA NA NA NA
3 Atlanta NA NA NA NA NA
4 Austin NA NA NA NA NA
5 Baltimore NA NA NA NA NA
表2:该表格为150K行×20列,有89个独特的市场名称。
> df
Spot.ID Date Hour Time Local.Date Broadcast.Week Local.Hour Local.Time Market
2 13072765 6/30/14 0 12:40 AM 2014-06-29 1 21 9:40 PM SPOKANE
261 13072946 6/30/14 5 5:49 AM 2014-06-30 1 5 5:49 AM BOSTON
356 13081398 6/30/14 10 10:52 AM 2014-06-30 1 7 7:52 AM SPOKANE
389 13082306 6/30/14 11 11:25 AM 2014-06-30 1 8 8:25 AM SPOKANE
438 13082121 6/30/14 8 8:58 AM 2014-06-30 1 8 8:58 AM BOSTON
469 13081040 6/30/14 9 9:17 AM 2014-06-30 1 9 9:17 AM ALBANY
482 13080104 6/30/14 12 12:25 PM 2014-06-30 1 9 9:25 AM SPOKANE
501 13082120 6/30/14 9 9:36 AM 2014-06-30 1 9 9:36 AM BOSTON
617 13080490 6/30/14 13 1:23 PM 2014-06-30 1 10 10:23 AM SPOKANE
答案 0 :(得分:2)
假设数据在数据帧df1,df2中。目标是将市场名称调整为相同,目前略有不同。
首先,列出市场,使用以下命令列出df1中的唯一名称,重复df2。
mk1 <- sort(unique(df1$market))
mk2 <- sort(unique(df2$market))
dmk12 <- setdiff(mk1,mk2)
dmk21 <- setdiff(mk2,mk1)
使用dmk12和dmk21识别不同的市场。决定使用什么名称,以及它们如何匹配,让我们改变&#34; Atlanta,GA&#34;从df1到&#34;亚特兰大&#34;来自df2。然后使用
df2[df2$market=="Atlanta","market"] = "Atlanta, GA"
格式为
df_to_change[df_to_change[,"column"]=="old data", "column"] = "new data"
如果您只有90个名称需要更正,我会写出90条更改行,如上图所示。
调整所有名称后,再次进行排序(唯一(df))并使用setdiff两次确认所有名称相同。