разделить столбец на 2 и заменить символ на число - R

Я получил результаты в следующем формате:

     Parameter  Wert
...
99      se.m  0.1000
100     se.m  0.1000
101    se.st  0.5000
102    se.st  0.500
...

Я хочу разделить столбец Parameter на два столбца: Parameter и Insentität. Разделение следует делать там, где находится точка .. Затем в результирующем столбце Intensität я хочу заменить все m значением 2 и заменить все st значением 3. Результат должен выглядеть так:

Parameter Intensität Wert
...
99  se        2  0.4000
100 se        2  0.0396
101 se        3  0.2702
102 se        3  1.1566
...

Мне удалось получить этот формат, однако я уверен, что есть более элегантный способ.

То, как я получил результаты, неуклюже. Изначально у меня было 2 столбца на выходе: se.m и se.st. Я вручную изменил имена столбцов:

colnames(results) <- c("2", "3")

а затем объединил два столбца в 1 столбец. Затем я добавил столбец, содержащий символы se в каждой строке.

results <- melt(results)
cbind( Parameter ="se", results)

Я знаю, что есть еще одна альтернатива. Например, используя extract из tidyr, но я не могу правильно понять синтаксис выражения. Также пакет stringr, я мог бы использовать функцию str_match или, может быть, также strsplit. Все это выглядит великолепно, но я, кажется, не могу применить их к своей проблеме. Я застрял здесь. Есть похожий вопрос, но я не смог найти решение, которое работает для меня.

PS: Буду признателен за любой вклад - комментарии, критику, советы. Я учусь, и любой совет для меня очень ценен.


person Nneka    schedule 20.03.2017    source источник
comment
проверьте Rpubs для обработки данных с помощью dplyr и tidyr. Я нашел его после того, как задал этот вопрос.   -  person Nneka    schedule 20.03.2017


Ответы (1)


Мы можем использовать separate

library(tidyr)
library(dplyr)
separate(df1, Parameter, into = c("Parameter", "Intensitat")) %>%
                mutate(Intensitat = recode(Intensitat, m = 2, st = 3))

#  Parameter Intensitat Wert
#1        se          2  0.1
#2        se          2  0.1
#3        se          3  0.5
#4        se          3  0.5

Или мы можем разделить с помощью read.table, указав sep, сделать transformation и cbind со столбцом "Wert"

cbind(transform(read.table(text= as.character(df1$Parameter), 
    col.names = c("Parameter", "Intensitat"), sep="."), 
      Intensitat = ifelse(Intensitat=="m", 2, 3)), df1["Wert"])
#    Parameter Intensitat Wert
#99         se          2  0.1
#100        se          2  0.1
#101        se          3  0.5
#102        se          3  0.5
person akrun    schedule 20.03.2017
comment
Спасибо @akrun, это именно то, что я искал! - person Nneka; 20.03.2017
comment
Я только что прочитал об операторе канала %>% на Rpubs, что привело меня к другим функциям, таким как separete. Просто я бы оставил это здесь, может быть полезно для других студентов с похожей проблемой - person Nneka; 20.03.2017
comment
@Danka Да, в списке пакетов tidyverse есть много полезных функций. - person akrun; 20.03.2017