2016-05-11 66 views
1

我正在处理大数据,我想用grep替换列值。在R中用grep替换列值

下面是一个简单的例子:

data=data.frame(state=c("AlAbama","Alaaska","Arizoona"), 
        gender=c("male","female","female")) 
datalist=data.frame(state=c("Alabama","Alaska","Arizona")) 

在所谓的“数据”的数据,我已经写在一个错误的方式各州的名字,我想通过在数据列表写名字来替换它们。 所以我想用“grep”中的“datalist”中的列值替换“data”中的列值。

我已经试过这样:

data[grep(data[,"state"],datalist[,"state"])] 

这:

for (u in datalist$state){ 
data[grep(u,datalist$state)] 
} 

但它不工作。

你有什么想法如何解决这个问题?

此致, 家人在一起

+0

'stringdist'包是你唯一的希望! https://cran.r-project.org/web/packages/stringdist/stringdist.pdf –

+0

谢谢!你能举个例子吗? – Mily

回答

0

快速尝试作为答案。

library(stringdist) 

data1 <- data.frame(
    state = c("AlAbama", "Alaaska", "Arizoona", "NY"), 
    gender = c("male", "female", "female", "unkn") 
) 
datalist <- data.frame(state = c("Arizona", "Alabama", "Alaska")) 

dist_m <- data.frame(stringdistmatrix(data1$state, datalist$state)) 

dist_m$minID <- apply(dist_m, 1, which.min) 

data1$state2 <- datalist$state[dist_m$minID] 

而结果:

 state gender state2 
1 AlAbama male Alabama 
2 Alaaska female Alaska 
3 Arizoona female Arizona 
4  NY unkn Alaska 

当然,你将需要小心一点,但作为一个特设的解决方案应该是罚款。

您还应该阅读stringdist函数的参数methodweight

+0

谢谢:)有一个愉快的一天。 – Mily

+0

你也是!让我知道它是否按预期工作。使用带有完整名称及其缩写的查找可能是一个好主意,然后,作为第二步,将缩写改为全名。 –

0

还有就是要解决这种多方式,但它可能是费时取决于一种清洁你想要做的。

首先,grep只替换一组字符。所以只有当你重复模式发生的时候,它才是正确的。例如,如果所有“a”都加倍,则可以使用grep将“aa”替换为“a”。

如果以错误方式输入的状态数量有限,则可以手动创建一个查找表,并将不正确的值与正确的值相关联,然后进行合并。或者对每个输入错误的国家进行grep步骤,但会更长。

如果要清理的模式数量很多,则可以使用open refine,它具有半手动群集功能,并实施了不同的度量标准以轻松地群集您的状态。