在R中循环中迭代字符或数字

时间:2015-11-19 18:05:27

标签: r

R很新,所以这可能是一个简单的答案。 我有一个字符列表。我想删除最后一个字母并将其迭代一次,因此A变为B,1变为2等。

waferlist<-c('L2MLQ','L2MIW','L2MK0','L2ML6','L2MO2','L2MHE','L2MK4','L2MN6','L2MLM')

for (i in waferlist)
{

lastchar<-substr(i,5,6)           #Get last character

k<-lastchar==LETTERS             #Is it a Letter

pos<-min(which(k==TRUE))        #Find letter position and itterate
pos<-pos+1
pos<-LETTERS[pos]

我遇到的问题是,如果最后一个字符是数字,则将其作为InfNA_character_返回,因为它不在LETTERS中。

我试图找到一种方法来选择下面的这些非结果,但它不会将其视为TRUE/FALSE语句,因此它不起作用。还有另一种方法吗?

     if(pos==Inf | pos==NA_character_)
    {
       lastchar<-as.numeric(lastchar)
       pos<-lastchar+1
    }

5 个答案:

答案 0 :(得分:2)

我们可以使用<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> </dependencies> 使用gsubfn条件将下一个数字或字母替换为最后一个字符。

if/else

library(gsubfn) gsubfn('(.)$', function(x) if(grepl('[0-9]', x)) as.numeric(x)+1 else LETTERS[match(x, LETTERS)+1], waferlist) #[1] "L2MLR" "L2MIX" "L2MK1" "L2ML7" "L2MO3" "L2MHF" "L2MK5" "L2MN7" "L2MLN" 为例,9为最后一个字符

Z

答案 1 :(得分:2)

你可以做R:

static bool search(List<int> numbers, int searchKey)
    {
        int UB = numbers.Count - 1;
        int LB = 0;
        int MP = (UB + LB) / 2;

        bool done = false;
        do
        {
            if (numbers[MP] > searchKey)
            {
                UB = MP - 1;
                MP = (UB + LB) / 2;
            }
            else if (numbers[MP] < searchKey)
            {
                LB = MP + 1;
                MP = (UB + LB) / 2;
            }
            else if (numbers[MP] == searchKey)
            {
                done = true;
                return true;
            }
            else
            {
                done = true;
                return false;
            }
        } while (!done);
        return false;
    }

答案 2 :(得分:2)

要获得有效的解决方案(假设您使用的是大写字母),

res <- sapply(waferlist, function(i) {
    out <- utf8ToInt(i)
    out[[nchar(i)]] <- out[[nchar(i)]] + 1
    if (out[[nchar(i)]] == 91) out[[nchar(i)]] <- 65
    ## For 9 cycling back to 0?
    else if (out[[nchar(i)]] == 58) out[[nchar(i)]] <- 48
    intToUtf8(out)
})

答案 3 :(得分:1)

这是一种dplyr方式:

library(stringi)

prefix = function(df, prefix) {
  names(df) = paste(prefix, 
                    names(df), 
                    sep = "_")
  df
}


letter_key = 
  data_frame(letter = 
               letters %>% 
               stri_trans_toupper) %>%
  mutate(n = 1:n() )

next_letter = 
  letter_key %>%
  mutate(next_n = n + 1) %>%
  left_join(letter_key %>% prefix("next"))

data_frame(wafer = waferlist) %>%
  mutate(letter =  wafer %>% stri_sub(-1)) %>%
  left_join(next_letter) %>%
  mutate(next_character = ifelse(is.na(next_letter),
                                 letter %>% 
                                   as.numeric %>% 
                                   `+`(1),
                                 next_letter))

答案 4 :(得分:1)

您可以转换为基数10并添加1然后转换回来。 Matlab有一个dec2base函数,这个副本可能有效 - 并且必须有一个包更好地支持这种基本转换(或者只是在base36中添加)

height