我一直在试图复制一个我已经用过很多SQL的移动,但似乎无法在R中找到等价物。我一直在搜索高位,低于名单和其他来源的解决方案,但无法找到我想要做的事情。R:在数据框列中找到特定字符的位置
我有一个全名变量的数据框,例如“Doe,John”。我已经能够使用以下代码分割这些名称:
# creates a split name matrix for each record
namesplit <- strsplit(crm$DEF_NAME, ',')
# takes the first/left part of matrix, after the comma
crm$LAST_NAME <- trimws(sapply(namesplit, function(x) x[1]))
# takes the last/right part of the matrix, after the comma
crm$FIRST_NAME <- trimws(sapply(namesplit, function(x) x[length(x)]))
但是一些名称有“。”而不是“,”分裂名称。例如,“Doe。John”。在其他情况下,我有两个“。”,即“Doe。John T.”。这里有一个例子:
> test$LAST_NAME
[1] "DEWITT. B" "TAOY. PETER" "ZULLO. JASON"
[4] "LAWLOR. JOSEPH" "CRAWFORD. ADAM" "HILL. ROBERT W."
[7] "TAGERT. CHRISTOPHER" "ROSEBERY. SCOTT W." "PAYNE. ALBERT"
[10] "BUNTZ. BRIAN JOHN" "COLON. PERFECTO GAUD" "DIAZ. JOSE CANO"
[13] "COLON. ERIK D." "COLON. ERIK D." "MARTINEZ. DAVID C."
[16] "DRISKELL. JASON" "JOHNSON. ALEXANDER" "JACKSON. RONNIE WAYNE"
[19] "SIPE. DAVID J." "FRANCO. BRANDT" "FRANCO. BRANDT"
对于这些情况下,我试图找到第一个“。”的位置。以便我可以使用用户定义的函数来分割名称。以下是这些功能。
left = function (string,char){
substr(string,1,char)}
right = function (string, char){
substr(string,nchar(string)-(char-1),nchar(string))}
我已经取得了一些成功的追随者,但是只需要第一条记录的位置,因此,例如它会抢位置6中的所有记录,而不是改变每一行。
test$LAST_NAME2 <- left(test$LAST_NAME,
which(strsplit(test$LAST_NAME, '')[[1]]=='.')-1)
我玩过apply和sapply,但我很明显错过了一些东西,因为它们看起来不起作用。
我的计划是使用ifelse函数来应用“。”解析到有这个问题的记录。
我担心答案很简单。但我卡住了。非常感谢你的帮助。
只是通过正则表达式来'strsplit',例如'strsplit(c('hello.world','hello,world'),'\\。|,')'。你也可以看看'tidyr :: separate'。 – alistaire
哇。我试过但未能取消“。”与“\\”。非常感谢alistaire。 –
我认为明智的做法是用逗号替换所有应该用逗号逗号的点,例如'gsub('(\\ w \\ w)[。](。)','\\ 1,\\ 2 ',crm $ DEF_NAME)',然后执行'strsplit'。 –