Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换输入为'的年龄;X周,Y天,Z小时';在R_R_String_Data Conversion - Fatal编程技术网

转换输入为'的年龄;X周,Y天,Z小时';在R

转换输入为'的年龄;X周,Y天,Z小时';在R,r,string,data-conversion,R,String,Data Conversion,我有一个年龄变量,包含以下(不一致)格式的观察结果: 我需要使用R将每个观察值转换为小时 我使用了strsplit(vector,“,”)在每个逗号处拆分变量 我遇到了麻烦,因为在“,”处拆分每个观察值会为每个观察值生成1到3个条目。我不知道如何对这些条目进行适当的索引,以便每次观察都有一行 我猜想,一旦我能够将这些值存储在合理的行中,我就可以从行中的每一列提取数字数据,并进行相应的转换,然后对整行求和 我也愿意使用任何不同的方法来解决这个问题。分割数据后,您可以解析定义时间(如“小时”、“周”

我有一个年龄变量,包含以下(不一致)格式的观察结果:

我需要使用R将每个观察值转换为小时

我使用了
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