【问题标题】:R split column depending on valuesR 根据值拆分列
【发布时间】:2010-12-02 18:46:06
【问题描述】:

我有以下数据,我想计算总分钟数,我想知道是否可以将一列拆分为两列,一列中为分钟,另一列中为秒?

> 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

【问题讨论】:

    标签: r


    【解决方案1】:

    我对日期不太熟悉,但您可以查看函数 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
    

    【讨论】:

    • 很好的解决方案!希望我能更多地投票。让我补充一下,我在一个参差不齐的 data.frame 上对其进行了测试,其中文本列具有不同数量的前导空白,并且它的性能完美无缺。
    【解决方案2】:

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

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

    StackOverflow 上有几个线程使用gsub

    【讨论】:

      【解决方案3】:

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

      第 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)
      

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 2021-05-14
        相关资源
        最近更新 更多