如何根据R中另一列中的值替换列值?

时间:2017-03-23 13:52:08

标签: r dplyr

在与熊猫合作几年后,我正在努力发展我的R技能,并且遇到了让我感到难过的问题。

我在一个名为df的数据框中拆分了一列数据,大致采用以下形式:

"MN - place1 - time"
...
"ST - place2 - time"

我使用了单独的函数将数据拆分为三列,旨在将中间列隔离为更新列:

cleaning_df <- separate(data = data, col = location, into = c("type", 'location', "time_data"), sep = "-")

采用以下形式:

type    location    time_data
MN      place1     time
ST      place2      time

不幸的是,有拼写错误意味着连字符不用于分隔前两个字段。

例如:

"STPlace2 - time"

哪个单独无法处理 - 或者我无法弄清楚如何。

幸运的是,没有太多错误,所以我创建了一个简单的查找表location_lookup,我希望将其用作数据框来纠正数据。

形式如下:

Broken_type     Correct_middle
STPlace2        Place2
...             ...

使用Pandas,我可以编写一个简单的,如果是非pythonic和非Pandas,应用函数逐行通过新生成的“类型”和“位置”列。

然后它将更新'place'中的值,其中'type'中的值在查找中匹配。

有更简洁的方法吗?我无法使用明显更有效的连接来解决问题。

更新:

我的示例中单独函数的输出以及错误将是:

type     place     time
MN       place1    time
ST       place2    time
STPlace2 time      NA

我希望能够创建一个函数或联接以使用查找表

Broken_type     Correct_middle
STPlace2        Place2
...             ...

标识左上一列中的第三行是错误的,并将值'time'替换为'Place2。

最终的输出列将是:

place
place1
place2
Place2

2 个答案:

答案 0 :(得分:0)

我们可以在regex

上传递extract
extract(data, location, into = c("type", "location", "time_data"),
           "(.{2})[^[:alnum:]]*([[:alnum:]]+)\\s+-\\s+(.*)")
#   type location time_data
#1   MN   place1      time
#2   ST   place2      time
#3   ST   Place2      time

数据

data <- structure(list(location = c("MN - place1 - time", "ST - place2 - time", 
"STPlace2 - time")), .Names = "location", class = "data.frame", row.names = c(NA, 
-3L))

答案 1 :(得分:0)

这不是很优雅,但是......

df$location <- sapply(1:length(df$type), function(x){
  if (df$type[x] %in% location_lookup$Broken_type){
    location_lookup$Correct_middle[match(df$type[x], location_lookup$Broken_type)]
  } else {

    df$place[x]
  }

})