【问题标题】:How to create a column grouping information from column with characters如何从包含字符的列创建列分组信息
【发布时间】:2018-03-02 17:57:37
【问题描述】:

我在这个组织的数据库中有一个列:

例子:

Location    
A_1
A_1
A_2
A_3
A_3
B_1
B_2

我想使用 R 按第一部分(“A”)对它们进行分组;也就是说,我想根据字母创建一个新列,所以数据库看起来像这样:

Location    Location_1
A_1         A
A_1         A
A_2         A
A_3         A
A_3         A
B_1         B
B_2         B

我已经尝试了mutate()ifelse() 函数,这里有另一个帖子 (Create column with grouped values based on another column),但我收到了这个错误:

"UseMethod("mutate_") 中的错误:没有适用于 'mutate_' 的方法 应用于“字符”类的对象

有人知道如何解决这个问题或其他方法吗?

这是我正在使用的 .csv 文件的一部分:

 Location    Species    Time
    A_1         FC       0.52
    A_1         JC       0.64
    A_2         JC       0.31
    A_2         FC       0.02 
    A_2         FC       0.01
    A_3         FC       0.13
    A_3         JC       0.97
    A_3         OT       0.86
    A_3         JC       0.55
    B_1         JC       0.32
    B_1         OT       0.04
    B_1         OT       0.06
    B_2         OT       0.12
    B_2         JC       0.13
    B_2         JC       0.14
    B_2         OT       0.56
    C_1         OT       0.57
    C_1         OT       0.86
    C_1         FC       0.58
    C_1         FC       0.76
    ...         ...       ...

【问题讨论】:

    标签: r database if-statement dplyr


    【解决方案1】:

    有一种简单的方法是使用gsubsub 来获取_ 之前的文本。可以这样实现:

    #data
    df <- data.frame(Location=c("A_1","A_1","A_2","A_3","A_3","B_1","B_2"), 
                 State=c("S_1","S_1","S_2","T_3","T_3","T_1","T_2"),
                 City=c("X_1","X_1","X_2","X_3","X_3","Y_1","Y_2"),
                 stringsAsFactors = FALSE)
    # single column
    df$Location_1 <- gsub("_.*", "", df$Location, perl = TRUE)
    
    df
    #  Location Location_1
    #1      A_1          A
    #2      A_1          A
    #3      A_2          A
    #4      A_3          A
    #5      A_3          A
    #6      B_1          B
    #7      B_2          B
    
    
    # using mutate_at for multiple columns. Its applying on all columns
    library(dplyr)
    df %>% mutate_at(names(df), .funs = funs(new = gsub("_.*", "", ., perl = TRUE)))
    
    #Result
    #Location State City Location_new State_new City_new
    #1      A_1   S_1  X_1            A         S        X
    #2      A_1   S_1  X_1            A         S        X
    #3      A_2   S_2  X_2            A         S        X
    #4      A_3   T_3  X_3            A         T        X
    #5      A_3   T_3  X_3            A         T        X
    #6      B_1   T_1  Y_1            B         T        Y
    #7      B_2   T_2  Y_2            B         T        Y
    

    选项 3

    从 csv 文件中读取:

    df <- read.table("d:/Files/data.csv", header = TRUE, stringsAsFactors = FALSE) 
    
    df$Location_1 <- gsub("_.*", "", df$Location, perl = TRUE)
    

    【讨论】:

    • 谢谢!但由于我有更多记录(大约 300 条),有没有办法自动表示“data.frame()”?
    • 你的数据是什么格式的? Excel? CSV? R 对象?
    • @Teresa 是的。你有vector/data.frame吗?
    • @Teresa 如果你有很多这样的专栏,那么你可以使用mutate_at。如果您能提供更多信息,我们可以提供帮助。
    • @Teresa 在 R 中该 csv 的对象名称是什么。你能粘贴你如何阅读它的代码
    【解决方案2】:

    您可以使用strsplit 将第一列用“_”分割。这应该做你想做的事:

    dat <- data.frame(Location=c("A_1","A_1","A_2","A_3","A_3","B_1","B_2"),
       stringsAsFactors = FALSE)
    
    dat$Location1 <- sapply(strsplit(dat$Location, "_"), "[[", 1)
    
    dat
    
    > dat
      Location Location1
    1      A_1         A
    2      A_1         A
    3      A_2         A
    4      A_3         A
    5      A_3         A
    6      B_1         B
    7      B_2         B
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2017-08-17
      • 2022-07-25
      相关资源
      最近更新 更多