【问题标题】:R Error in adding leading zeros through functionR通过函数添加前导零时出错
【发布时间】:2019-09-18 18:41:41
【问题描述】:

我正在编写代码以更新多个数据集的前导零值。我认为将代码包装在函数中更容易:

convert_scs <- function(df, state,county,street) {

  df$state <- ifelse( nchar(df$state) == 1, paste('0', df$state, sep=''), df$state )

  df$county <- ifelse( nchar(df$county) == 1, paste('00',df$county, sep=''), df$county )
  df$county <- ifelse( nchar(df$county) == 2, paste('0', df$county, sep=''), df$county )

  df$street <- ifelse( (nchar(df$street) == 3) ,  paste('000', df$street, sep=''),  df$street)
  df$street <- ifelse( (nchar(df$street) == 4) ,  paste('00', df$street, sep=''),  df$street)
  df$street <- ifelse( (nchar(df$street) == 5) ,  paste('0', df$street, sep=''),  df$street)

  return(df)

}


convert_scs(predicted20,STATEFP,COUNTYFP, STREETCE)

predicted20 已通过以下方式转换为数据帧:

predicted20 <- as.data.frame(predicted20)

我不断收到以下错误:

$&lt;-.data.frame(*tmp*, "state", value = logical(0)) 中的错误: 替换有0行,数据有1200

数据集中没有缺失。

任何帮助将不胜感激!

预测20的样本

之前的样本数据:

STATEFP(char)  COUNTYFP(char)   STREETCF(char)
1                    1              20100
1                    1              10500
1                    3              11502

需要:

STATEFP(char)  COUNTYFP(char)   STREETCF(char)
01                    001              020100
01                    001              010500
01                    003              011502

【问题讨论】:

    标签: r function dataframe dplyr tidyverse


    【解决方案1】:

    我们可以将函数内部的$替换为[[

    convert_scs <- function(df, state,county,street) {
    
      df[[state]] <- ifelse( nchar(df[[state]]) == 1, paste('0', df[[state]], sep=''), df[[state]]
     )
    
      df[[county]] <- ifelse( nchar(df[[county]]) == 1, paste('00',df[[county]], sep=''), df[[county]] )
     df[[county]] <- ifelse( nchar(df[[county]])  == 2, paste('0',df[[county]] , sep=''),df[[county]]  )
    
      df[[street]] <- ifelse( (nchar(df[[street]] ) == 3) ,  paste('000',  df[[street]],  sep=''),  df[[street]] )
      df[[street]]  <- ifelse( (nchar( df[[street]] ) == 4) ,  paste('00',  df[[street]] , sep=''),  df[[street]] )
      df[[street]] <- ifelse( (nchar( df[[street]] ) == 5) ,  paste('0',  df[[street]],  sep=''),   df[[street]] )
    
      df
    
    }
    

    并在函数中将列名作为字符串传递

    convert_scs(predicted20,'STATEFP','COUNTYFP', 'STREETCF')
    #    STATEFP COUNTYFP STREETCF
    #1      01      001   020100
    #2      01      001   010500
    #3      01      003   011502
    

    此外,这可以通过sprintf 轻松完成

    library(purrr)
    library(dplyr)
    predicted20 %>%
       map2_df(.,  c("%02d", "%03d", "%06d"), ~ sprintf(fmt = .y, .x))
    

    或在base R

    predicted20[] <-  Map(sprintf, predicted20, fmt = c("%02d", "%03d", "%06d"))
    

    数据

    predicted20 <- structure(list(STATEFP = c(1L, 1L, 1L), COUNTYFP = c(1L, 1L, 
    3L), STREETCF = c(20100L, 10500L, 11502L)), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

    • 新错误:(function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x, :找不到对象“STATEFP”
    • @lydias 你有矩阵还是data.frame 我假设你已经转换为data.frame predicted20 &lt;- as.data.frame(predicted20)
    • 我有一个data.frame。在我在调用函数的参数周围添加引号后,该函数确实运行了,但列值中没有添加前导零...
    • @lydias 你能用一个可重复的小例子来更新吗?没有数据或结构,不清楚
    • @lydias 如果您有列名,则只需按列名对数据进行子集化,然后对其进行更新。即nm1 &lt;- c("STATEFP", "COUNTYFP", "'STREETCF"); predicted20[nm1] &lt;- Map(sprintf, predicted20[nm1], fmt = c("%02d", "%03d", "%06d"))
    猜你喜欢
    • 2015-04-28
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多