2015-09-23 22 views
2

我有一個包含了按照這一(不一致)格式觀測年齡變量:轉換年齡輸入爲'X周,Y天,Z小時中的R

3 weeks, 2 days, 4 hours 
4 weeks, 6 days, 12 hours 
3 days, 18 hours 
4 days, 3 hours 
7 hours 
8 hours 

我需要使用到每個觀測到幾小時轉換R.

我已經使用strsplit(vector, ',')到可變在每個逗號分開。

我運行的問題,因爲在「」產量從1至3項爲每個觀察分裂每個觀察的任何地方。我不知道如何對這些條目進行適當的索引,以便每次觀察都得到一行。

我猜,一旦我能夠將這些值存儲在懂事行,我可以從每列連續提取數字數據,並相應轉換,再總結整個行。

我也接受任何不同的方法來解決這個問題。

+3

我認爲[這個Q&A](http://stackoverflow.com/questions/8204878/from-timespan-for-example-15-min-or-2-sec-to-001500-or-000002-usin)應該讓你開始。 – Henrik

回答

1

你分割你的數據後,您可以解析爲定義諸如「小時」,「周」,「天」的時代關鍵詞的結果列表,並創建包含相關值(或0數據幀,如果沒有的價值某個關鍵字)。你可以做到這一點像這樣的東西:

library(dplyr) 
vector = c("3 weeks, 2 days, 4 hours", "4 weeks, 6 days, 12 hours", "3 days, 18 hours", "4 days, 3 hours", "7 hours", "8 hours") 
split_vector = strsplit(vector, ",", fixed = TRUE) 


parse_string = function(i){ 
    x = split_vector[[i]] 
    data_frame(ID = i) %>% 
    mutate(hours = ifelse(any(grepl("hours", x)), as.numeric(gsub("\\D", "", x[grepl("hours", x)])), 0), 
      days = ifelse(any(grepl("days", x)), as.numeric(gsub("\\D", "", x[grepl("days", x)])), 0), 
      weeks = ifelse(any(grepl("weeks", x)), as.numeric(gsub("\\D", "", x[grepl("weeks", x)])), 0)) 
} 

all_parsed = lapply(1:length(split_vector), parse_string) 
all_parsed = rbind_all(all_parsed) %>% 
    mutate(final_hours = hours + days * 24 + weeks * 7 * 24) 
1

Hadleyverse來救援再次:

library(lubridate) 
library(stringr) 

dat <- readLines(textConnection(" 3 weeks, 2 days, 4 hours 
4 week, 6 days, 12 hours 
3 days, 18 hours 
4 day, 3 hours 
7 hours 
8 hour")) 

sapply(str_split(str_trim(dat), ",[ ]*"), function(x) { 
    sum(sapply(x, function(y) { 
    bits <- str_split(str_trim(y), "[ ]+")[[1]] 
    duration(as.numeric(bits[1]), bits[2]) 
    }))/3600 
}) 

## [1] 556 828 90 99 7 8 

我疲憊不堪的數據位,顯示它也是它是如何解析的東西一定的柔性。我真的不認爲第二個str_trim是絕對必要的,但沒有周期來驗證。

博覽會是它修剪原矢量然後將其分解爲組件(這使得向量的列表)。然後迭代該列表,並且將各個向量元素進一步修剪並分割爲#和單位持續時間。這通過lubridate和價值返回並自動轉換爲數字秒通過sum調用,然後我們把它變成幾個小時。

+1

該函數在一組測試數據上成功運行。不幸的是,當我嘗試解析我的整個數據集(276,395個值)時,它會返回錯誤「錯誤:無效單元名稱:NA」。我將所有缺失值轉換爲零小時,仍然收到錯誤。 – Ivoire

+0

然後一個或多個行在「周」,「周」,「日」,「天」,「小時」,「小時」(等)之外具有一些值。你能看出哪些人除了這些之外還有其他人嗎? – hrbrmstr

+0

你是對的。不幸的是,觸發錯誤的線在目視檢查時並不是異常的。我結束了使用Python來做轉換;特別是[pytimeparse](https://github.com/wroberts/pytimeparse)模塊。 – Ivoire

相關問題