2016-10-01 99 views
2

拆分柱我有一个“数据”帧,具有多个列,其中之一是“运行时”,这两种格式具有数据:ř条在数据帧

Runtime 
1 h 10 min 
67 min 
1 h 0 min 
86 min 
97 min 

我要转换所有这些进入分钟。试过'strsplit'和'strip_split_fixed'。任何人都可以告诉我一种实现我的目标,分裂或其他方法的方法吗?

预先感谢您!

+0

它目前是字符串吗?还是一个因素? – CephBirk

+3

这不是R输出。你能为你的例子提供实际的R代码吗?这避免了“哦,你的解决方案适用于我的例子,但不是我的实际数据” –

回答

0

这里是你如何能做到这一个例子:

# 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 
+0

绝对的天才!感谢很多CephBirk –

+0

没问题kash。无论您发现哪一个答案最有用,您都可以使用绿色选中标记来加注和/或标记。这让每个人都知道你发现最有用的东西。 – CephBirk

8

我觉得我看到了这种解决方案的地方。别打我。

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 
2

你可以得到它使用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" 
+0

谢谢皮埃尔。这真是令人印象深刻。试图在另一个问题上实现你的方法,但卡住了。 我有类似的问题,其中,我有像财务价值; 预算:2.00E + 07,7.50E + 07,500000,3.05E + 07。不知道我应该如何修改你的公式以获得所有10年的 –

+0

财务使用'options(scipen = 15)'。然后再试一次 –

+1

太棒了!感谢名单。如果不是像你这样的知识海洋,像我们这样的池塘会枯竭 –

0

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