在与熊猫合作几年后,我正在努力发展我的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
答案 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]
}
})