【问题标题】:How can I nest an If statement in a substr function in R如何在 R 的 substr 函数中嵌套 If 语句
【发布时间】:2020-01-30 03:04:58
【问题描述】:

我正在尝试将一个数字字段分成两部分,以便与另一个数据集合并。字符数为 6 或 7 个字符长。我能够很容易地获得最后一个字符,但现在我需要该字段的前一个或两个字符,具体取决于它的长度。这是我的尝试,但我收到了许多错误。是否可以嵌套这样的 If 语句?还是我需要交换它并在循环中使用不同的赋值语句运行 If 语句?

df$new_field <- as.numeric(substr(df$GEOID, 1 ,if(nchar(df$GEOID)=6){
  return(1)
}
else{
  return(2)
}))

【问题讨论】:

    标签: r if-statement substr


    【解决方案1】:

    With 可以使用ifelse 而不是if/else,因为ifelse 是矢量化的,而if/else 只接受长度为1 的单个值并返回长度1

    df$new_field <- with(df, as.numeric(substr(GEOID, 1, 
                                 ifelse(nchar(GEOID) == 6, 1, 2))))
    

    或者另一种选择是将逻辑向量转换为数字

    n  <- (nchar(df$GEOID) != 6) + 1
    df$new_field <- with(df, as.numeric(substr(GEOID, 1, n)))
    

    使用可重现的示例

    v1 <- c('1234567', '123456', '1234')
    n  <- (nchar(v1) != 6) + 1
    n
    #[1] 2 1 2
    substr(v1, 1, n)
    #[1] "12" "1"  "12"
    

    注意:除了substrsubstring也可以用同样的方法

    【讨论】:

      【解决方案2】:

      我们可以使用substring

      df$new_field <- substring(df$GEOID, 1, c(1, 2)[(nchar(df$GEOID) == 7) + 1])
      df$new_field
      #[1] "A"  "D"  "AB"
      

      sub 和正则表达式。

      with(df, ifelse(nchar(GEOID) == 7, sub('(..).*', '\\1', GEOID), 
                                         sub('(.).*', '\\1', GEOID)))
      #[1] "A"  "D"  "AB"
      

      数据

      df <- data.frame(GEOID = c('ABCDEF', 'DEFABC', 'ABCDEFG'), stringsAsFactors = FALSE)
      

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 2020-06-17
        相关资源
        最近更新 更多