R разделить столбец в зависимости от значений - PullRequest
3 голосов
/ 02 декабря 2010

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

> 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

и т.д.

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

Я не очень знаком с датами, но вы можете посмотреть на функции 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

РЕДАКТИРОВАТЬ: поскольку вы хотите разделить только data.frame, чтобы иметь возможность рассчитать общую сумму минут, вы даже не создаете новые столбцы min и sec и может просто работать со столбцом time.2.этих двух шагов уже достаточно

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

R> [1] 30
2 голосов
/ 05 декабря 2010

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

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

В StackOverflow есть несколько потоков, использующих gsub:

1 голос
/ 02 декабря 2010

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

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

Data <- q
minsec_str <- apply(Data,1, function(x) gsub("[[:alpha:]]| $","",x))

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

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

Шаг 3) Добавить имена и преобразовать в data.frame

colnames(minsec) <- c("min","sec")
minsec <- data.frame(minsec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...