从主列表创建从A到Z的子列表

时间:2018-08-29 14:45:06

标签: r

任务

我正在尝试使用更好的功能(循环或矢量),根据字母表中的每个字母将较大的列表解析为26个(也许是27个)较小的列表(即,第一个列表包含该较大列表的所有开头的条目)带有字母A的第二个列表,带有字母B的第二个列表...可能的第27个列表包含使用其他数字之一的所有剩余条目。

然后,我尝试使用adist函数来标识列表中哪些名称相似(例如,我需要更正拼写错误的公司名称,例如,公司A需要更正为公司A)。

到目前为止的代码

#creates a vector for all uniqueID/stakeholders whose name starts with "a" or "A"
stakeA <- grep("^[aA].*", uniqueID, value=TRUE)

#creates a distance matrix for all stakeholders whose name starts with "a" or "A"
stakeAdist <- (adist(stakeA), ignore.case=TRUE) 

write.table(stakeAdist, "test.csv", quote=TRUE, sep = ",", row.names=stakeA, col.names=stakeA)

说明 我可以使用上面的代码完成任务的第一步;我创建了一个以字母A开头的所有条目的列表,然后计算了每个条目之间的“距离”(显示在矩阵中)。

询问一个

我可以复制并粘贴此代码26次,然后在字母中移动,但我认为这样做可能是一种更优雅的方式,我想学习它!

询问两个

到目前为止,为了“更正”条目,我不得不编写表格并移至Excel。在Excel中,我必须插入一个行条目以使矩阵正确对齐(我想这是我代码中的一个小缺陷)。要更正条目,我使用条件格式来突出显示adist在1到10之间的所有实例,然后必须手动通过突出显示并更正列表。

任何有关使用R进一步使该方法/更好的策略自动化的功能/方法的帮助都将非常有用。

1 个答案:

答案 0 :(得分:0)

举个例子可以帮助您,但是这可能有用。

编辑:我假设您的数据位于名为data.frame的{​​{1}}中

df

使用for(i in 1:26) { stake <- subset(df, uniqueID==grep(paste0('^[',letters[i],LETTERS[i],'].*'), df$uniqueID, value=T)) stakeDist <- adist(stakeA,ignore.case=T) write.table(stakeDist, paste0("stake_",LETTERS[i],".csv"), quote=T, sep=',') } 以及内置的paste0letters的组合会创建您的LETTERS表达式。

使用grep,提取正确的ID

subset还将为paste0创建一个唯一的文件名。

它们都使用write.table()循环

连接在一起