【问题标题】:Create a new column in R based on the content of another column [specific case]根据另一列的内容在R中创建一个新列[具体案例]
【发布时间】:2020-08-05 13:08:41
【问题描述】:

我正在寻找一种聪明的方法来修改我的 data.set。如果我能做到 会节省很多时间

我的数据集是这样的

column1 
1.0
1.0
2.0
2.0.15
0.0
1.0.30

我想创建一个新的“父母栏”,我保留第一部分 第 1 列的

column1  column2
1.0        1
1.0        1
2.0        2
2.0.15     2.0
0.0        0
1.0.30     1.0

我想这样做的原因是我想在元素之间重新创建父子关系。第 2 列应该是父母,第 1 列是它的后代。非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    使用tidyverse 和正则表达式的一个选项:

    library(tidyverse)
    
    orig <- tribble(
      ~column1, 
      "1.0",
      "1.0",
      "2.0",
      "2.0.15",
      "0.0",
      "1.0.30"
    )
    
    orig
    #> # A tibble: 6 x 1
    #>   column1
    #>   <chr>  
    #> 1 1.0    
    #> 2 1.0    
    #> 3 2.0    
    #> 4 2.0.15 
    #> 5 0.0    
    #> 6 1.0.30
    
    orig %>% 
      mutate(parent = str_replace(column1, "\\.\\d+$", ""))
    #> # A tibble: 6 x 2
    #>   column1 parent
    #>   <chr>   <chr> 
    #> 1 1.0     1     
    #> 2 1.0     1     
    #> 3 2.0     2     
    #> 4 2.0.15  2.0   
    #> 5 0.0     0     
    #> 6 1.0.30  1.0
    

    reprex package (v0.3.0) 于 2020-08-05 创建

    正则表达式 \\.\\d+$ 采用文字点 . 后跟一个或多个数字,后跟字符串结尾 $ 并将此匹配替换为空 ""。另请参阅https://regexr.com/59lnl(其中$ 行的末尾被替换为换行符\n)。

    【讨论】:

    • 亲爱的@DAvid 感谢您的时间和解释。它真的帮助我了解发生了什么。我非常感谢
    【解决方案2】:

    试试这个:

    #Data
    df <- structure(list(column1 = c("1.0", "1.0", "2.0", "2.0.15", "0.0", 
    "1.0.30")), row.names = c(NA, -6L), class = "data.frame")
    #Code
    #Create column
    df$column2 <- sub("^(.*)[.].*", "\\1", df$column1)
    

    输出:

      column1 column2
    1     1.0       1
    2     1.0       1
    3     2.0       2
    4  2.0.15     2.0
    5     0.0       0
    6  1.0.30     1.0
    

    【讨论】:

    • 亲爱的@Duck 感谢您一直如此友善和乐于助人。也感谢您的简洁回答:)
    【解决方案3】:
    df$column2 <- sub("\\.[0-9]+$", "", df$column1)
    df
    #   column1 column2
    # 1     1.0       1
    # 2     1.0       1
    # 3     2.0       2
    # 4  2.0.15     2.0
    # 5     0.0       0
    # 6  1.0.30     1.0
    

    数据

    df <- data.frame(column1 = c("1.0", "1.0", "2.0", "2.0.15", "0.0", "1.0.30"))
    

    【讨论】:

    • 感谢@sindri 的帮助。我很感激
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多