我有一个数据集(名为A ),其列为' TimeColumn '显示在快照中。 我想完成以下任务:
步骤1:对于min中的所有值,仅提取数字
步骤2:对于以小时和分钟为单位的所有值,将其转换为min并仅提取结果数字
步骤3:对于每一行,将提取的值添加到新列
中所以例如,如果条目是119分钟,我想提取119.如果条目是1小时30分钟,我想提取90。
我使用了以下代码,它成功地提取了数字。但是,当时间以小时为单位时,它无法完成任务。例如。 ' 1'在< 1小时30分钟'只是提取但是' 30'不是。
for (num in seq(1,length(A$TimeColumn), by=1)) #replace 100 by nrow(A)
{
cat("Row number",num, "is",as.numeric(gsub("([0-9]+).*$", "\\1",A$TimeColumn[num] )))
cat("\n")
}
答案 0 :(得分:3)
我们可以使用str_extract_all
(从stringr
)提取“TimeColumn”中的数字到list
,循环遍历list
元素(sapply(...)
),将其转换为'numeric'('x1'),if
length
大于1,然后执行算术将小时转换为分钟或else
返回分钟,并将其分配给新列'Min'。
library(stringr)
A$Min <- sapply(str_extract_all(A$TimeColumn, "\\d+"), function(x) {
x1 <- as.numeric(x)
if(length(x1)>1) x1[1]*60 + x1[2] else x1 })
A$Min
#[1] 98 119 105 90 92 135 104 100 104 93
base R
选项是使用* 60 +
将'h'替换为sub
,删除'min'子字符串并进行评估
unname(sapply(sub("\\s+min", "", sub("h", "* 60 +", A$TimeColumn)),
function(x) eval(parse(text=x))))
#[1] 98 119 105 90 92 135 104 100 104 93
A <- structure(list(TimeColumn = c("98 min", "119 min", "105 min",
"1h 30 min", "92 min", "135 min", "104 min", "100 min", "104 min",
"93 min")), .Names = "TimeColumn", row.names = c(NA, -10L),
class = "data.frame")