R拆分列取决于值

时间:2010-12-02 18:46:07

标签: 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

3 个答案:

答案 0 :(得分: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 :(得分:2)

如果您想要快速解决方案,那么您应该考虑基于gsub的解决方案:

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

StackOverflow上有几个线程使用gsub

答案 2 :(得分:1)

注意:我确信有更优雅的方法,但这是第一个想到的解决方案。

步骤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)添加colnames并转换为data.frame

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