2010-12-02 26 views
3

J'ai les données suivantes et je veux calculer le nombre total de minutes et je me demandais s'il était possible de diviser la colonne en deux avec les minutes dans une colonne et les secondes dans une autre colonne?R colonne divisée en fonction des valeurs

> 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 

==> Pour donner:

> q 
    min seconds 
1 0  22 
2 1  7 

etc

Répondre

5

Je ne suis pas si familier avec les dates, mais vous pouvez regarder dans le plaisir cations as.Date ou strptime. Utilisation de votre 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") 

vous pouvez maintenant sélectionner les valeurs spécifiques, il suffit de prendre un coup d'oeil à

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

et affecter

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

cela donne:

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: puisque vous voulez seulement diviser le data.frame afin de pouvoir calculer la somme totale des minutes, vous ne créez même pas les nouvelles colonnes min et sec et pouvez simplement travailler avec la colonne time.2. ces assez deux étapes sont déjà

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

R> [1] 30 
+1

solution Great! J'aurais aimé pouvoir voter plus. Permettez-moi juste d'ajouter que je l'ai testé sur un data.frame déchiré avec des colonnes de texte ayant un nombre variable de blancs principaux et qu'il fonctionne parfaitement. –

1

NOTE: Je suis sûr qu'il ya des méthodes plus élégantes, mais c'est la première solution qui vient à l'esprit.

Étape 1) se débarrasser des caractères (y compris les espaces de fin):

Étape 2) Diviser en deux chaînes, convertir les chaînes en numérique, et rbind

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

Étape 3) Ajouter colnames et convertir en data.frame

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