【问题标题】:exclude part of a character string in a column in a dataframe在数据框中的列中排除部分字符串
【发布时间】:2020-12-03 17:00:16
【问题描述】:

我有一个 df,它有几个用下划线分隔的 id,像这样:

df1:
id           v1
1001          2 
10002_10002  19

我希望删除下划线和下划线之后的任何内容,如下所示:

df1:
id           v1
1001          2 
10002        19

我试过这段代码,但它给了我一个列表,而不是一个 df。有人可以帮忙吗?

df2 <- strsplit(df1$id, split='_', fixed=TRUE)

【问题讨论】:

    标签: r string dataframe


    【解决方案1】:

    您需要访问列表的内容,然后保留拆分产生的两个元素中的第一个:

    df1$id <- strsplit(df1$id, "_", fixed=TRUE)[[1]][1]
    

    你也可以在这里使用sub

    df1$id <- sub("_.*$", "", df1$id)
    

    【讨论】:

      【解决方案2】:

      这里有tidyverse/stringr的解决方案:

      library(tidyverse)
      my_df <- data.frame(
        stringsAsFactors = FALSE,
                      id = c("1001", "10002_10002"),
                      v1 = c(2L, 19L)
      )
      my_df %>% 
        mutate(id=str_remove(id, regex("(_.*)")))
      #>      id v1
      #> 1  1001  2
      #> 2 10002 19
      

      reprex package (v0.3.0) 于 2020 年 12 月 3 日创建

      【讨论】:

      • 谢谢@zoowalk。
      【解决方案3】:

      我喜欢用 stringr 包

      require(stringr)
          df1 <- data.frame(id = c("1001","1002_10002"), v1 = c(2,19))
          
          df1$id <- str_remove(df1$id, pattern = "_.+")
      

      【讨论】:

      • 谢谢你,莱昂纳多。
      【解决方案4】:

      我们可以从stringr使用word

      library(stringr)
      library(dplyr)
      df1 %>%
           mutate(id = word(id, 1, sep="_"))
       #      id v1
       #1  1001  2
       #2 10002 19
      

      另一个选项是trimws 来自base R

      df1$id <- trimws(df1$id, whitespace = "_.*")
      

      数据

      df1 <- structure(list(id = c("1001", "10002_10002"), 
      v1 = c(2L, 19L)), class = "data.frame", row.names = c(NA, 
      -2L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2021-05-22
        • 2018-11-16
        • 1970-01-01
        相关资源
        最近更新 更多