Как создать столбец, группирующий информацию из столбца с символами

У меня есть столбец в базе данных с этой организацией:

Пример:

Location    
A_1
A_1
A_2
A_3
A_3
B_1
B_2

Я хочу сгруппировать их по первой части («А»), используя 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() после другого сообщения здесь (Создать столбец с сгруппированными значениями на основе другого столбца), но я получаю эту ошибку:

«Ошибка в 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
    ...         ...       ...

person mtao    schedule 02.03.2018    source источник


Ответы (2)


Есть простой способ использовать gsub или sub, чтобы получить текст перед _. Это может быть достигнуто как:

#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)
person MKR    schedule 02.03.2018
comment
Спасибо! Но поскольку у меня больше записей (около 300), есть ли способ автоматически представить data.frame ()? - person mtao; 02.03.2018
comment
в каком формате у вас есть данные? Excel? CSV? R объект? - person Liza; 02.03.2018
comment
@ Тереза ​​Да. У вас есть vector / data.frame? - person MKR; 02.03.2018
comment
@Teresa Если у вас много таких столбцов, вы можете использовать mutate_at. Мы можем помочь, если вы предоставите дополнительную информацию. - person MKR; 02.03.2018
comment
@Liza да, это файл csv, который я импортировал и над которым работал в R. Как я могу применить mutate_at в этом случае? Огромное спасибо за помощь! - person mtao; 03.03.2018
comment
@ Тереза ​​Ладно. Укажите несколько названий столбцов, которые вы хотите изменить, и я могу добавить ответ. - person MKR; 03.03.2018
comment
@Teresa, какое имя объекта для этого csv в R., вы можете вставить код, как вы его читаете в - person Liza; 03.03.2018
comment
Возможно, я не объяснил себя так (или я не понимаю, о чем вы спрашиваете, извините); У меня есть только два столбца, с которыми я хочу работать (Location и Location_1), но у меня есть больше строк (около 300). Поэтому я хотел знать, есть ли способ автоматически представить data.frame (), чтобы мне не приходилось записывать каждый из них? Это ошибка, которую я получил, когда применил ваш код _1 _ $ ‹-. Data.frame( * tmp * , loc, value = list(Location = c("SAM_C1", : replacement has 8 rows, data has 282 - person mtao; 03.03.2018
comment
@Teresa Понятно. Я думал, у вас много столбцов. Многие строки вообще не проблема. Можете ли вы вставить часть своего csv как часть вопроса, чтобы я мог изменить свой ответ в соответствии с вашими потребностями? - person MKR; 03.03.2018
comment
Вот оно, так продолжается; в этой части единственная проблема, с которой я столкнулся, связана с столбцом местоположения - person mtao; 03.03.2018
comment
@Teresa Спасибо. Я изменю свой ответ через некоторое время. - person MKR; 03.03.2018
comment
Вам просто нужно прочитать этот csv в R следующим образом: dat ‹-read.csv (C: /Desktop/FileName.csv) просто измените местоположение и имя файла на то, что у вас есть - person Liza; 03.03.2018
comment
@Teresa Я добавил в свой ответ способ обработки вашего CSV-файла. Используйте их, и это должно сработать. Вам необходимо исправить путь и имя файла csv - person MKR; 03.03.2018
comment
@Liza Simple read.csv не будет работать в файле из OP, поскольку в данных файла нет , разделителя. Следовательно, лучше использовать read.table. - person MKR; 03.03.2018
comment
@ Тереза ​​рада помочь. Вы можете изменить свой вопрос, чтобы пояснить, что вы хотите читать из csv, и применить правила, чтобы сделать его доступным для чтения будущим пользователям. - person MKR; 03.03.2018

Вы можете использовать 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
person Liza    schedule 02.03.2018