如何从包含字符的列创建列分组信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从包含字符的列创建列分组信息相关的知识,希望对你有一定的参考价值。

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

例:

Location    
A_1
A_1
A_2
A_3
A_3
B_1
B_2

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

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_'的方法应用于类”character“的对象

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

这是我正在使用的.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
    ...         ...       ...
答案

有一种简单的方法可以使用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)
另一答案

您可以使用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

以上是关于如何从包含字符的列创建列分组信息的主要内容,如果未能解决你的问题,请参考以下文章

对具有重复项(字符串值)的列进行分组

按 Hive 中的列分组

如何从 PySpark DataFrame 的列中分离特定字符并使用它们形成一个新列?

如何通过为每个单独的列列出分组后的所有数据并求和

Python:从数据框字符串列中提取维度数据并为每个列创建具有值的列

如何从包含一系列值的列创建新的递增值列?