2010-12-02 56 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

我對日期不是很熟悉,但您可以看看樂趣文章as.Datestrptime。 使用您的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以便能夠計算總分鐘數,所以您甚至不需要創建新列minsec,並且可以簡單地使用列time.2。 這兩個步驟已經夠

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

R> [1] 30 
+1

的最佳解決方案!希望我能夠更多地投票。讓我補充一點,我測試了一個不規則數據框架,文本列有不同數量的前導空白,它的表現完美無瑕。 – 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)