2010-12-02 54 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)