拆分柱我有一个“数据”帧,具有多个列,其中之一是“运行时”,这两种格式具有数据:ř条在数据帧
Runtime
1 h 10 min
67 min
1 h 0 min
86 min
97 min
我要转换所有这些进入分钟。试过'strsplit'和'strip_split_fixed'。任何人都可以告诉我一种实现我的目标,分裂或其他方法的方法吗?
预先感谢您!
拆分柱我有一个“数据”帧,具有多个列,其中之一是“运行时”,这两种格式具有数据:ř条在数据帧
Runtime
1 h 10 min
67 min
1 h 0 min
86 min
97 min
我要转换所有这些进入分钟。试过'strsplit'和'strip_split_fixed'。任何人都可以告诉我一种实现我的目标,分裂或其他方法的方法吗?
预先感谢您!
这里是你如何能做到这一个例子:
# setting up your data.frame of interest
df = data.frame(Runtime = c('1 h 10 min', '67 min', '1 h 0 min', '86 min', '97 min'))
df$Runtime = gsub(' min', '', df$Runtime) # remove the min labels
hrs = grepl('h', x = df$Runtime) # which values are in an "x h y min" format?
runtime_sub = sapply(strsplit(df[hrs, 'Runtime'], ' h '), function(i) sum(as.numeric(i) * c(60, 1))) # convert the "x h y min" entries into numeric values in minutes
df$Runtime = as.numeric(df$Runtime) # convert the vector to numeric (yes, it's supposed to return a warning. Ignore it.
df[hrs, 'Runtime'] = runtime_sub # add the converted values
这导致:
Runtime
1 70
2 67
3 60
4 86
5 97
绝对的天才!感谢很多CephBirk –
没问题kash。无论您发现哪一个答案最有用,您都可以使用绿色选中标记来加注和/或标记。这让每个人都知道你发现最有用的东西。 – CephBirk
我觉得我看到了这种解决方案的地方。别打我。
df = data.frame(Runtime = c('1 h 10 min', '67 min', '1 h 0 min', '86 min', '97 min'))
df$exp <- gsub("h", "* 60 +", df$Runtime)
df$exp <- gsub("min", "* 1", df$exp)
sapply(df$exp, FUN = function(x) eval(parse(text = x)))
1 * 60 + 10 * 1 67 * 1 1 * 60 + 0 * 1 86 * 1 97 * 1
70 67 60 86 97
你可以得到它使用gsubfn
和正则表达式的一个电话:
library(gsubfn)
gsubfn("^(?:(\\d+)\\s*h)?\\s*(\\d+)\\s*min.*$",
~ sum(as.numeric(x) * 60, as.numeric(y), as.numeric(z), na.rm=TRUE), x)
#[1] "70" "67" "60" "86" "97"
谢谢皮埃尔。这真是令人印象深刻。试图在另一个问题上实现你的方法,但卡住了。 我有类似的问题,其中,我有像财务价值; 预算:2.00E + 07,7.50E + 07,500000,3.05E + 07。不知道我应该如何修改你的公式以获得所有10年的 –
财务使用'options(scipen = 15)'。然后再试一次 –
太棒了!感谢名单。如果不是像你这样的知识海洋,像我们这样的池塘会枯竭 –
1)读df[[1]]
,如果第三列是NA,则第一列给出了分钟;否则,60倍的第一列加上第三列给出了分:
with(read.table(text = as.character(df[[1]]), fill = TRUE),
ifelse(is.na(V3), V1, 60*V1 + V3))
## [1] 70 67 60 86 97
2)一种变化是粘贴“0 h”的每个组件的开头不具有H给予hm
和读取计算第一列加上第三列的60倍。
hm <- paste(ifelse(grepl("h", df[[1]]), "", "0 h"), df[[1]])
with(read.table(text = hm), 60 * V1 + V3)
## [1] 70 67 60 86 97
它目前是字符串吗?还是一个因素? – CephBirk
这不是R输出。你能为你的例子提供实际的R代码吗?这避免了“哦,你的解决方案适用于我的例子,但不是我的实际数据” –