【问题标题】:How can I modify this function to return a Unique ID generated from specific fields?如何修改此函数以返回从特定字段生成的唯一 ID?
【发布时间】:2019-02-19 16:24:11
【问题描述】:

我正在编写一个闪亮的应用程序,它将模拟谷歌表单中的数据写入谷歌表格。我想创建一个函数,该函数使用字符串修改来根据用户输入插入唯一 ID。此函数将在下载文件时在本地调用,可重复性非常重要..所以我认为它应该依赖于输入,而不是像“ids”包中那样随机生成...

这里是函数的示例代码:

#Unique_id produces a 9 digit code by calling phone number, timestamp, and two letters - first and last name

unique_id <- function(f, l, y, z){

##where f is the column of FIRST NAME

    f %>% str_replace(" ", "") %>% toupper() %>% str_sub(1, 2)

##where l is LAST NAME

    l %>% str_replace(" ", "") %>% toupper() %>% str_sub(1, 2)

##Where y is TIMESTAMP

    y %>% paste0() %>% str_extract("[:digit:][:digit:]-[:digit:][:digit:]") %>% str_replace_all("-", "")

##Where z is phone number formatted NNN-NNN-NNNN

    z %>% str_extract("-[:digit:][:digit:][:digit:]-") %>% str_replace_all("-", "")

##Where UID is the UserID generated...

     UID <- c(f, l , y, z)

    UID <- str_replace("-", "")

    return(UID)
}

我怀疑最后一个块是错误的......但它可能都是错误的,我真的只是在开玩笑。

这是我想调用它的数据框中可能包含的信息示例...

Phone          Address          FirstName  LastName           Timestamp
1 951-349-8967  2134 Road Road   John       jerrod     2018-09-14 20:09:38
2 342-651-3752  154 House St.   Dora       angela     2018-09-14 20:09:38

在第 1 行调用此函数的理想结果是 UID 为 JJ0914349。然后我会将它插入一个新列,即“UID”字段。

现在,我明白了

 Error: Empty `pattern` not supported 

感谢任何帮助。

【问题讨论】:

  • 部分问题在于您没有将UID 传递给str_replace。您还应该使用str_replace_all,这样该行将变为UID &lt;- str_replace_all(UID, "-", "")
  • str_replace 只会替换第一次出现的有问题的模式,即str_replace('111-111-1111', '-', '') 返回111111-1111。我假设您想替换所有破折号,因此 str_replace_all
  • 感谢您的关注;我以为我替换了那些实例。现在,当我调用函数unique_id 时,我得到一个不同数字输出的向量。它仍然不是我希望的字符串。也许我需要使用不同的函数来代替串联?
  • 您还需要将每个片段的输出分配回对象fy,lz,所以对于ff &lt;- f %&gt;% str_replace_all(" ", "") %&gt;% toupper() %&gt;% str_sub(1, 2)。对所有四个都这样做,然后再试一次。

标签: r replace split stringr unique-key


【解决方案1】:

由于需要的数据都在固定位置:

DF %>% mutate(id = paste0(toupper(substr(FirstName, 1, 1)),
                          toupper(substr(LastName, 1, 1)),
                          substr(Timestamp, 6, 7),
                          substr(Timestamp, 9, 10), 
                          substr(Phone, 5, 7)))

给予:

         Phone        Address FirstName LastName           Timestamp        id
1 951-349-8967 2134 Road Road      John   jerrod 2018-09-14 20:09:38 JJ0914349
2 342-651-3752  154 House St.      Dora   angela 2018-09-14 20:09:38 DA0914651

注意

我们使用了这些数据:

Lines <- "Phone,          Address,          FirstName,  LastName,           Timestamp
1,951-349-8967,  2134 Road Road,   John,       jerrod,     2018-09-14 20:09:38
2,342-651-3752,  154 House St.,   Dora,       angela,     2018-09-14 20:09:38"

DF <- read.csv(text = Lines, as.is = TRUE, strip.white = TRUE)

【讨论】:

  • 这是我的解决方案的更简洁的途径。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多