2016-10-01 98 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