将列的值提取到字符串中并替换数据框列中的值

时间:2014-10-21 20:40:44

标签: r string replace dataframe lookup

除了编程之外,我对这个问题的正确方法感到迷茫。我有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

1 个答案:

答案 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两次确认所有名称相同。