转换输入为'的年龄;X周,Y天,Z小时';在R
我有一个年龄变量,包含以下(不一致)格式的观察结果: 我需要使用R将每个观察值转换为小时 我使用了转换输入为'的年龄;X周,Y天,Z小时';在R,r,string,data-conversion,R,String,Data Conversion,我有一个年龄变量,包含以下(不一致)格式的观察结果: 我需要使用R将每个观察值转换为小时 我使用了strsplit(vector,“,”)在每个逗号处拆分变量 我遇到了麻烦,因为在“,”处拆分每个观察值会为每个观察值生成1到3个条目。我不知道如何对这些条目进行适当的索引,以便每次观察都有一行 我猜想,一旦我能够将这些值存储在合理的行中,我就可以从行中的每一列提取数字数据,并进行相应的转换,然后对整行求和 我也愿意使用任何不同的方法来解决这个问题。分割数据后,您可以解析定义时间(如“小时”、“周”
strsplit(vector,“,”)
在每个逗号处拆分变量
我遇到了麻烦,因为在“,”处拆分每个观察值会为每个观察值生成1到3个条目。我不知道如何对这些条目进行适当的索引,以便每次观察都有一行
我猜想,一旦我能够将这些值存储在合理的行中,我就可以从行中的每一列提取数字数据,并进行相应的转换,然后对整行求和
我也愿意使用任何不同的方法来解决这个问题。分割数据后,您可以解析定义时间(如“小时”、“周”、“天”)的关键字的结果列表,并创建包含相关值的数据框(如果某个关键字没有值,则为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)
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
库(lubridate)
图书馆(stringr)
dat我认为应该让您开始。此函数在测试数据集上成功运行。不幸的是,当我试图解析我的整个数据集(276395个值)时,它返回错误“error:Invalid unit name:NA”。我将所有缺少的值转换为零小时,但仍然收到错误。然后,除了week
,weeks
,day
,days
,hour
,一行或多行还有一些值,小时数
(等)。你能看到除了这些以外还有什么吗?你是对的。不幸的是,通过目视检查,触发错误的线路没有异常。我最终使用python进行转换;特别是模块。grep
可能是识别异常线路的更好方法
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