如何根据位置从不同长度的字符串中提取字符?

时间:2015-07-27 21:56:10

标签: r

我想去秃头试图解决这个问题。我试图根据位置从不同长度的字符串中提取字符。例如,假设我有一个包含8行和1列的数据框,标题为:" Time" 该列在每行中具有以下值:

TIME
5  
20 
100
105
150
1050
2005
2010

我试图找出如何根据位置提取这些字符串中的字符并采用以下格式。如果你看,你可以看到最后两个字符放在 00:here:00 ,而所有其他字符都放在这里:00:00 。结果应该是:

5 - > 00:05:00(如果只有1个字符)
20 - > 00:20:00(如果有2个字符)
100 - > 1:00:00(如果有3个字符)
105 - > 1:05:00(如果有3个字符)
150 - > 1:50:00(如果有3个字符)
1050 - > 10:50:00(如果有4个字符)
2005年 - > 20:05:00(如果有4个字符)
2010 - > 20:10:00(如果有4个字符)

基本上伪代码就是这样的 从dataframe $ column1中提取最后两个字符并将其放在 00:here:00 - 所有剩余的字符应该这里:00:00

4 个答案:

答案 0 :(得分:3)

format( as.POSIXct(sprintf("%04.0f", TIME), format="%H%M"), format="%H:%M:%S")
[1] "00:05:00" "00:20:00" "01:00:00" "01:05:00"
[5] "01:50:00" "10:50:00" "20:05:00" "20:10:00"

sprintf将时间变量的字符值填充为前导0' s。 as.POSIXct将当前日期作为该时间读入,然后外部format.POSIXt函数会删除日期字符。

答案 1 :(得分:2)

这种做法怎么样?

time <- readLines(n = 8)
5
20
100
105
150
1050
2005
2010
sub("(\\d{2})(\\d{2})", "\\1:\\2:00", sprintf("%04d", as.numeric(time)))
# [1] "00:05:00" "00:20:00" "01:00:00" "01:05:00" "01:50:00" "10:50:00" "20:05:00" "20:10:00"

答案 2 :(得分:1)

这个怎么样:

library(stringr)
TIME <- c('5','20','100','105','150','1050','2005','2010')
TIMEpadded <- paste0(str_pad(TIME, width=4, pad=0), '00')
sub('(.+)(.{2})(.{2})', '\\1:\\2:\\3', TIMEpadded)
## [1] "00:05:00" "00:20:00" "01:00:00" "01:05:00" "01:50:00" "10:50:00" "20:05:00" "20:10:00"

答案 3 :(得分:0)

public static String transform (String in)
{
    while (in.length() < 4)
    {
        in = "0" + in;
    }
    in = in.substring(0,2) + ":" + in.substring(2,4) + ":00";
    return(in);
}

public static void main (String[] args)
{
    for (String s : new String[]{"5", "20", "100", "105", "150", "1050", "2005", "2010"})
    {
        System.out.println(s + " -> " + transform(s));
    }
}

方法转换: 1)将零添加到字符串中的时间值,直到获得4位数字符串。 2)在字符串中插入“:”,每两个字符和一个尾随“00”。

方法main运行您提供的示例, 输出如下:

5 -> 00:05:00
20 -> 00:20:00
100 -> 01:00:00
105 -> 01:05:00
150 -> 01:50:00
1050 -> 10:50:00
2005 -> 20:05:00
2010 -> 20:10:00