【问题标题】:split values of a column and store only numeric values in a different column拆分列的值并仅将数值存储在不同的列中
【发布时间】:2022-01-14 11:57:11
【问题描述】:

我有一个长表格式的数据框,如下所示:

mydf <- data.frame(id = c(123, 123, 123, 123, 123),
                    name =c("test_2001", "test_2002", "test_2003", "test_2004", "test_2005"),
                    value = c(15, 20, 25, 30, 35))
mydf
#>    id      name value
#> 1 123 test_2001    15
#> 2 123 test_2002    20
#> 3 123 test_2003    25
#> 4 123 test_2004    30
#> 5 123 test_2005    35

现在,我想从 name 列中拆分属性,这样我可以删除这些数值并将它们存储在另一个名为 year 的列中,输出如下:

desired <- data.frame(id = c(123, 123, 123, 123, 123),
                      name =c("test", "test", "test", "test", "test"),
                      year =c(2001:2005),
                      value = c(15, 20, 25, 30, 35))
desired
#>    id name year value
#> 1 123 test 2001    15
#> 2 123 test 2002    20
#> 3 123 test 2003    25
#> 4 123 test 2004    30
#> 5 123 test 2005    35

考虑到我必须将此更改应用于大量数据,我该如何自动化此步骤?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    基础 R

    cbind(mydf, strcapture("(.*)_(.*)", mydf$name, list(name="", year=1L)))
    #    id      name value name year
    # 1 123 test_2001    15 test 2001
    # 2 123 test_2002    20 test 2002
    # 3 123 test_2003    25 test 2003
    # 4 123 test_2004    30 test 2004
    # 5 123 test_2005    35 test 2005
    

    dplyr/tidyr

    library(dplyr)
    library(tidyr)
    mydf %>%
      separate(name, into = c("name", "year"), sep = "_")
    #    id name year value
    # 1 123 test 2001    15
    # 2 123 test 2002    20
    # 3 123 test 2003    25
    # 4 123 test 2004    30
    # 5 123 test 2005    35
    

    (注意,year 是一个字符串,可以用as.integer 转换为整数。)

    数据表

    library(data.table)
    as.data.table(mydf)[, c("name", "year") := tstrsplit(name, "_")][]
    #       id   name value   year
    #    <num> <char> <num> <char>
    # 1:   123   test    15   2001
    # 2:   123   test    20   2002
    # 3:   123   test    25   2003
    # 4:   123   test    30   2004
    # 5:   123   test    35   2005
    

    (同样,year 这里仍然是一个字符串。)

    【讨论】:

    • 谢谢@r2evans
    • 对于这种特殊情况,默认的sep 就可以了,所以separate(name, into = c("name", "year")) 就足够了
    • 它非常适合test_2001 这样的情况,但我发现如果名称类似于test_area_sqkm_2001,那么它就不起作用。知道如何解决这种情况吗?
    • 至少有几种方法可以解释该字符串,您需要更好地定义您的期望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2017-05-12
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多