2010-12-02 5 views
3

У меня есть следующие данные, и я хочу рассчитать общее количество минут, и мне было интересно, если его можно разбить столбец на два с помощью минут в одном столбце и секундах в другом столбце?R раздельный столбец в зависимости от значений

> q 
     time 
1 0m 22s 
2 1m 7s 
3 3m 35s 
4 11m 43s 
5 1m 8s 
6 2m 21s 
7 9m 33s 
8 0m 56s 
9 0m 2s 
10 0m 2s 
11 0m 50s 
12 0m 25s 
13 0m 33s 
14 2m 26s 
15 0m 20s 
16 1m 47s 
17 0m 36s 
18 0m 3s 
19 0m 2s 
20 0m 5s 

==> Чтобы дать:

> q 
    min seconds 
1 0  22 
2 1  7 

и т.д.

ответ

5

Я не знаком с датами, но вы можете посмотреть в удовольствие ctions as.Date или strptime. Использование data.frame:

df <- data.frame(time = c("0m 22s", "1m 7s", "3m 35s", "11m 43s", "1m 8s", "2m 21s", "9m 33s", "0m 56s", "0m 2s", "0m 2s", "0m 50s", "0m 25s", "0m 33s", "2m 26s", "0m 20s", "1m 47s", "0m 36s", "0m 3s", "0m 2s", "0m 5s")) 

df$time.2 <- strptime(df$time, "%Mm %Ss") 

теперь вы можете выбрать конкретные значения, просто посмотрите на

attributes(df[, "time.2"]) 

и назначить

df$min <- df[, "time.2"][["min"]] 
df$sec <- df[, "time.2"][["sec"]] 

это дает:

R> df 
     time    time.2 min sec 
1 0m 22s 2010-12-02 00:00:22 0 22 
2 1m 7s 2010-12-02 00:01:07 1 7 
3 3m 35s 2010-12-02 00:03:35 3 35 
4 11m 43s 2010-12-02 00:11:43 11 43 
5 1m 8s 2010-12-02 00:01:08 1 8 
6 2m 21s 2010-12-02 00:02:21 2 21 
7 9m 33s 2010-12-02 00:09:33 9 33 
8 0m 56s 2010-12-02 00:00:56 0 56 
9 0m 2s 2010-12-02 00:00:02 0 2 
10 0m 2s 2010-12-02 00:00:02 0 2 
11 0m 50s 2010-12-02 00:00:50 0 50 
12 0m 25s 2010-12-02 00:00:25 0 25 
13 0m 33s 2010-12-02 00:00:33 0 33 
14 2m 26s 2010-12-02 00:02:26 2 26 
15 0m 20s 2010-12-02 00:00:20 0 20 
16 1m 47s 2010-12-02 00:01:47 1 47 
17 0m 36s 2010-12-02 00:00:36 0 36 
18 0m 3s 2010-12-02 00:00:03 0 3 
19 0m 2s 2010-12-02 00:00:02 0 2 
20 0m 5s 2010-12-02 00:00:05 0 5 

EDIT: , поскольку вы хотите разделить data.frame, чтобы иметь возможность рассчитать общую сумму минут, вы даже не можете создавать новые столбцы min и sec и можете просто работать со столбцом time.2. эти два шага уже достаточно

df$time.2 <- strptime(df$time, "%Mm %Ss") 
sum(df[, "time.2"][["min"]]) 

R> [1] 30 
+1

Отличное решение! Хотел бы я проголосовать за него больше. Позвольте мне добавить, что я тестировал его на оборванных data.frame с текстовыми столбцами, имеющими различное количество ведущих пробелов, и он работает безупречно. – 2010-12-03 04:11:42

1

ПРИМЕЧАНИЕ: Я уверен, что есть более изящные методы, но это первое решение, которое пришло на ум.

Шаг 1) избавиться от символов (включая пробелы в конце):

Шаг 2) Разделить на две строки, преобразовывать строки в цифровой, и rbind

minsec <- do.call(rbind, lapply(strsplit(minsec_str, " "), as.numeric)) 

Шаг 3) Добавить colnames и конвертировать в data.frame

colnames(minsec) <- c("min","sec") 
minsec <- data.frame(minsec) 
2

Если вы хотите быстро решение, то вам следует рассмотреть решение, основанное на gsub:

min <- as.numeric(sub("m.*$", "", time)) 
sec <- as.numeric(gsub("^.*\\ |s$", "", time)) 

Есть несколько потоков на StackOverflow, используя gsub:

Смежные вопросы