我正在尝试将R中的列拆分为分钟和秒。问题是,该列只是数字:例如它将具有“752”,“843”,“823”,“956”,(最多约2000是最高的)等...其代表7分钟和52秒,8分43秒,8分23秒等......我想把它分成两列。一列为分钟数,一列为秒数。然后我将使用这些列创建第三个“totalSeconds”,它将在7分52秒内获得“472”。
我一直在搜索,检查正则表达式等等。我似乎无法弄明白。这里的另一个类似问题向我指出函数'substr',但我坚持认为,因为每个变量并不总是具有相同的字符数,即752 vs 1145.任何帮助?或者至少也许有人可以指出我正确的方向?
答案 0 :(得分:2)
如果角色的最后两个元素代表秒,剩余的前一个/两个元素/秒代表分钟,那么请尝试以下方法:
res <- data.frame(v = v, minutes = substr(v, 1, nchar(v)-2), seconds = substr(v, nchar(v)-1, nchar(v)))
> res
v minutes seconds
1 752 7 52
2 843 8 43
3 823 8 23
4 956 9 56
为了计算总秒数:
res <- as.data.frame(apply(res, 2, function(x) as.double(as.character(x))))
res$tot.sec <- res$minutes*60 + res$seconds
> res
v minutes seconds tot.sec
1 752 7 52 472
2 843 8 43 523
3 823 8 23 503
4 956 9 56 596
答案 1 :(得分:0)
在这个例子中:
df=data.frame(D=round(1000*runif(100)))
D是包含字符串的列。如果你这样做:
df$MIN=ifelse(nchar(df$D)>=3,substr(df$D, 0,1),0) #if there are only seconds
这将返回分钟
和
df$SEC=substr(df$D, nchar(df$D)-1,nchar(df$D))
将返回秒数。
这是你想要的吗?
答案 2 :(得分:0)
您可以从“tidyr”中考虑separate
。在这里,我将它与“dplyr”中的mutate
结合使用,以获得您正在寻找的输出。
请注意,separate
允许您指定字符串的左侧或字符串的右侧,具体取决于sep
值是正还是负。这将允许我们适当地处理像“1000”这样的案件。
library(dplyr)
library(tidyr)
df %>%
separate(secs, into = c("min", "sec"), sep = -3) %>%
mutate(tot = as.numeric(min)*60 + as.numeric(sec))
# min sec tot
# 1 7 52 472
# 2 8 43 523
# 3 8 23 503
# 4 9 56 596
# 5 10 00 600
df <- data.frame(secs = c("752","843","823", "956", "1000"))