【问题标题】:how to separate a column into multiple columns and change the results from characters to numbers如何将一列分成多列并将结果从字符更改为数字
【发布时间】:2018-12-07 12:26:42
【问题描述】:

##id## ##initiativen##

1 abc 2a 2 CDE 2B 3个EFD 4 格 5 吉特达 5v 6 jydjytd e

你好,我有类似的东西,只是更大,我想知道将列倡议分成两列最有效的方法,一列包含数字 (2,2,5,4),另一列包含字母或空格。它必须是一个通用公式,因为我需要应用它的数据框也很大。字母对应一个特定的倡议编号,但第一个倡议编号没有标明,“a”对应倡议编号 2。

我希望它看起来像用数字替换的字母(空白=1、a=2、b=3 等)

id    initiativen question
abc        2         2
cde        3         2
efd        2         N/A
geh        4         N/A
jytd       23        5
jydjytd    6         N/A
bfdhslbf   1         3

我尝试过使用“分离”,但它并没有真正起作用,也没有解决第一个倡议没有对应字母的问题。 任何帮助或建议都将受到极大的欢迎和帮助。

非常感谢:)

【问题讨论】:

  • 为什么你删除了你的实际样本数据并发布了截图?那没用。请编辑并包含示例数据。

标签: r filter tidyverse


【解决方案1】:

下面的tidyverse解决方案怎么样?

library(tidyverse);
df %>%
    separate(initiativen, into = c("p1", "p2"), sep = "(?<=[0-9])(?=[a-z])") %>%
    mutate(
        initiativen = case_when(
            str_detect(p1, "[a-z]") ~ p1,
            str_detect(p2, "[a-z]") ~ p2),
        question = case_when(
            str_detect(p1, "[0-9]") ~ p1,
            str_detect(p2, "[0-9]") ~ p2)) %>%
    mutate(initiativen = ifelse(is.na(initiativen), 1, match(initiativen, letters) + 1)) %>%
    select(-p1, -p2)
#       id initiativen question
#1     abc           2        2
#2     cde           3        2
#3     efd           2     <NA>
#4     geh           4     <NA>
#5    jytd          23        5
#6 jydjytd           6     <NA>
#7 vbdjfkb           1        4

请注意,警告可以安全地忽略,因为它源于separateing 时缺少的字段。

说明:我们使用正向后视和前瞻将initiativen 中的条目拆分为p1 和p2 两部分;然后我们用来自p1或p2的条目填充initiativen和question,这取决于它们是否包含数字"[0-9]"或字符"[a-z]";使用match(initiativen, letters) 将字符转换为数字,最后清理data.frame。


样本数据

df <- read.table(text =
    "       id initiativen
1     abc          2a
2     cde          2b
3     efd           a
4     geh           c
5    jytd          5v
6 jydjytd           e
7 vbdjfkb          4", row.names = 1)

【讨论】:

    【解决方案2】:

    使用data.table

    # Step one
        setDT(df)
    df[, ":="(
          question  = gsub("[a-z]", "", initiativen),
          initiativen = match(gsub("[0-9]", "", initiativen), letters, nomatch = 0) + 1L
        )
       ]
    df
            id initiativen question
    1:     abc           2        2
    2:     cde           3        2
    3:     efd           2         
    4:     geh           4         
    5:    jytd          23        5
    6: jydjytd           6         
    7: vbdjfkb           1        4
    
    # Then some tidying
    df[, question := ifelse(nzchar(question), question, NA)]
    
    df
            id initiativen question
    1:     abc           2        2
    2:     cde           3        2
    3:     efd           2     <NA>
    4:     geh           4     <NA>
    5:    jytd          23        5
    6: jydjytd           6     <NA>
    7: vbdjfkb           1        4
    

    数据

    df <- data.frame(
      id = c("abc", "cde", "efd", "geh", "jytd", "jydjytd", "vbdjfkb"),
      initiativen = c("2a", "2b", "a", "c", "5v", "e", "4"),
      stringsAsFactors = FALSE
    )
    

    编辑

    也可以一步完成:

    df[, question := gsub("[a-z]", "", initiativen)
       ][, ":="(
          question = ifelse(nzchar(question), question, NA),
          initiativen = match(gsub("[0-9]", "", initiativen), letters, nomatch = 0) + 1L
        )
       ]
    

    【讨论】:

      【解决方案3】:

      对于第二列,您可以使用正则表达式仅保留数值:

      df$initiativen <- gsub("[^0-9]", "", df$initiativen)
      

      【讨论】:

        猜你喜欢
        • 2021-08-20
        • 2021-12-02
        • 2010-12-18
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 2021-05-18
        • 2018-09-06
        • 1970-01-01
        相关资源
        最近更新 更多