【问题标题】:Remove records starting a character (Vxxx) to enable floor() command in R删除以字符(Vxxx)开头的记录以在 R 中启用 floor() 命令
【发布时间】:2015-12-04 21:37:03
【问题描述】:

我正在处理急诊室 ICD-9 代码数据(健康诊断),它是三位数字代码,后面最多有 2 个小数(例如:499、499.1、499.51 等)。一些特殊代码使用字母“V”而不是第一个数字,例如“V10.46”。

每次急诊室就诊(行)最多可以有 11 个诊断代码(列),因此我使用 reshape() 将数据集更改为长格式。现在我想使用 floor() 删除那些小数点。但是 R 不能用一个字符来放置东西!我收到此错误:Math.factor(dtl$diag) 中的错误:下限对因子没有意义

这篇文章有一些相关性,但我想知道是否有更好的方法? R: Remove character observations in a variable

有什么想法吗?

【问题讨论】:

    标签: r character floor


    【解决方案1】:

    您可以使用正则表达式来删除点和后面的所有内容。

    x <- c("499", "499.1", "499.51", "V10.46")
    gsub("\\..*", "", x)
    # Output:
    # [1] "499" "499" "499" "V10"
    

    【讨论】:

    • 我是新手——“\\..*”指的是什么?和“”?
    • 这是一个正则表达式——它的意思是“替换一个文字 . (在正则表达式中是 '\.',而反斜杠需要在 R 中转义,因此 '\\.')后跟任何内容(.*)一无所有("")”。所以它会删除任何东西,包括小数点,模拟floor。虽然我认为你也想去掉第一个“V”对吧?看看?gsub,看看你是否可以做类似的事情来删除“V”(它会比这个答案中的 gsub 更容易)。然后,您可以使用as.numeric 将字符串转换为数字。
    • 这个gsub表达式可以在调用某个列时使用吗?在您的示例中,如果我想对第 4 列中的值执行此操作,我会这样做: gsub("\\..*", "", x$4)?
    • 差不多:x[[4]] &lt;- gsub("\\..*","",x[[4]])
    • 好的,但是分配了第 4 列-我想用没有小数的新值替换第 4 列中的所有值。我感兴趣的专栏叫做“diag”。这是我的尝试: dtlong$diag = gsub("\\..*", "", dtlong$diag) ?谢谢!
    【解决方案2】:

    以@Vincent Zoonekynd 的出色回答为基础,如果目标是在数据上使用floor,您可以去掉“V”并在其余部分调用floor

    x <- c("499", "499.1", "499.51", "V10.46")
    # replace all occurences of "V" with nothing ("") in x:
    x.stripped <- gsub("V", "", x) 
    # convert to numeric so we can use floor():
    x.floor <- floor(as.numeric(x.stripped))
    

    根据您的错误消息“对因子没有意义”,您的数据列已作为字符串读入(因为某些行中有“V”),R 的默认行为是转换将列字符串化为因子(如类别)。

    如果您收到关于 gsub 无法处理因子的错误,您需要先将您的列转换为字符串:

    mydf$columname <- as.character(mydf$columnname)
    

    然后你可以像以前一样继续。

    【讨论】:

    • 嗨,mathical.coffee。我喜欢这个想法,但问题是如果你去掉“V”和地板,那么代码就变得无法与共享相同数字的预先存在的两位数代码区分开来。 (例如,“V10.46”将与所有代码“10.x”都变为“10”)。我试图用 0 替换 V,但它仍然与现有代码合并。你能把“V”换成多位数字吗?
    • 嗯,如果要保留前面的 V,请使用@VincentZoonekynd 的答案。
    • 我将“V”替换为“919”——它与任何代码都足够不同,但仍然满足数字格式要求!
    【解决方案3】:

    对于前三个字母,您可以使用子字符串函数。

    icd9 <- factor(c("499", "499.1", "499.51", "V10.46"))
    substr(as.character(icd9),1,3)# as.character is used 
                                  # because icd9 is factor in your data
    

    输出

    [1] "499" "499" "499" "V10"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多