2017-08-26 55 views
1

试图在R中创建一个15位salesforce ID到18位数的转换。公式写在这里:https://salesforce.stackexchange.com/questions/27686/how-can-i-convert-a-15-char-id-value-into-an-18-char-id-value 但是在C#中,我想在R做这件事。将二进制字符串转换为R中的文本(salesforce ID转换为15到18)

我已经做出了一个笨重的公式,就像我在R中所知道的那样,它可以用于15位数的输入并成功返回18位数。我想知道如何通过dplyr将其应用于data.frame中的列。

重复性代码:

SFID_Convert <- function(fifteen_digit) { 
    if (length(fifteen_digit == 15)) { 

    # binary map ---- 
    binary <- 
     c(
     "00000", 
     "00001", 
     "00010", 
     "00011", 
     "00100", 
     "00101", 
     "00110", 
     "00111", 
     "01000", 
     "01001", 
     "01010", 
     "01011", 
     "01100", 
     "01101", 
     "01110", 
     "01111", 
     "10000", 
     "10001", 
     "10010", 
     "10011", 
     "10100", 
     "10101", 
     "10110", 
     "10111", 
     "11000", 
     "11001", 
     "11010", 
     "11011", 
     "11100", 
     "11101", 
     "11110", 
     "11111" 
    ) 
    letter <- c(LETTERS, 0:5) 
    binarymap <- data_frame(binary, letter) 


    # sfid ---- 
    sfid <- substr(fifteen_digit, 1, 15) 
    s1 <- substr(sfid, 1, 5) 
    s2 <- substr(sfid, 6, 10) 
    s3 <- substr(sfid, 11, 15) 

    convertID <- function(str_frag) { 
     str_frag <- paste(rev(strsplit(str_frag, NULL)[[1]]), collapse = '') 
     str_frag <- strsplit(str_frag, NULL)[[1]] 
     str_frag[which(unlist(gregexpr("[0-9]", str_frag)) == 1)] <- 0 
     str_frag[which(unlist(gregexpr("[a-z]", str_frag)) == 1)] <- 0 
     str_frag[which(unlist(gregexpr("[A-Z]", str_frag)) == 1)] <- 1 
     str_frag <<- paste(str_frag, collapse = '') 
    } 

    convertID(s1) 
    n1 <- str_frag 
    convertID(s2) 
    n2 <- str_frag 
    convertID(s3) 
    n3 <- str_frag 

    binary <- data_frame(c(n1, n2, n3)) %>% 
     select(binary = 1) %>% 
     left_join(binarymap) 

    return(paste(sfid, paste(binary$letter[1:3], collapse = ''), sep = ''))} 
} 

例如:

sfid <- "001a003920aSDuh" 
SFID_Convert(sfid) 
[1] "001a003920aSDuhAAG" 

这就是我想要的东西,但是当你把它应用到DF ...

col <- c("001a003920aSDuh", "001a08h010JNkJd") 
name <- c("compA", "compB") 
df <- data_frame(name, col) 

它采用“AAG”正确地为第一个计算,并将其应用于每一行。我可以通过lapply它,但如果我有10万行的数量级,这将是我认为这样做的错误方法。

任何帮助表示赞赏!仍然在这里学习。 :)

回答

2

您的代码存在各种问题。我在下面包含了一个可能的解决方案,它应该更高效:

1:定义二进制字符串&之间的映射字母。你可以在你的功能之外做到这一点。只需定义一次,所有必要的转换,&在函数中使用它。

binary <- c("00000","00001","00010","00011","00100","00101","00110","00111", 
      "01000","01001","01010","01011","01100","01101","01110","01111", 
      "10000","10001","10010","10011","10100","10101","10110","10111", 
      "11000","11001","11010","11011","11100","11101","11110","11111") 
binary.reverse <- lapply(binary, function(x){paste0(rev(strsplit(x, split = "")[[1]]), collapse = "")}) 
binary2letter <- c(LETTERS, 0:5) 
names(binary2letter) <- unlist(binary.reverse) 
rm(binary, binary.reverse) 

我在这一步反转了二进制字符串,这样我就不必为所有的ID重复执行了。结果保存在命名向量中而不是数据框中。

2:以接受向量作为输入的方式创建函数。请注意,要检查字符串是否包含X个字符,您应该使用nchar()而不是length()。后者返回字符串数,而不是字符串中的字符数。

SFID_Convert <- function(sfid) { 
    sfid <- as.character(sfid) # in case the input column are factors 

    str_num <- gsub("[A-Z]", "1", gsub("[a-z0-9]", "0", sfid)) 

    s1 <- substring(str_num, 1, 5) 
    s2 <- substring(str_num, 6, 10) 
    s3 <- substring(str_num, 11, 15) 

    sfid.addon <- paste0(sfid, 
         binary2letter[s1], 
         binary2letter[s2], 
         binary2letter[s3]) 

    sfid[nchar(sfid)==15] <- sfid.addon[nchar(sfid)==15] 

    return(sfid) 
} 

检查解决方案:

sfid <- "001a003920aSDuh" 
col <- c("001a003920aSDuh", "001a08h010JNkJd") 
name <- c("compA", "compB") 
df <- data_frame(name, col) 

> SFID_Convert(sfid) 
[1] "001a003920aSDuhAAG" 

> df %>% mutate(new.col = SFID_Convert(col)) 
# A tibble: 2 x 3 
    name    col   new.col 
    <chr>   <chr>    <chr> 
1 compA 001a003920aSDuh 001a003920aSDuhAAG 
2 compB 001a08h010JNkJd 001a08h010JNkJdAAL 
+0

辉煌谢谢!我回家后会试试看。我试图找到让我的代码更高效的方法。有人想到在函数外部使用二进制映射。如果我想将它添加到我经常使用的个人包中,我想将它嵌入到右侧? (这就是为什么我首先做到了这一点) –

+1

在个人软件包的(有限)体验中,我编写了在同一个软件包中使用其他帮助函数的函数,所以我不认为需要函数来完全独立。但是,你可能希望作为一个单独的问题提出并获得更多意见。 –

+0

有效且公平的答复。我会去做。谢谢!我一边盲目地努力完成这一切,一边学习。我敢肯定,我的效率很低,但无论如何!谢谢您的帮助 –

相关问题