Это явная функция, которая, кажется, работает так, как вы хотели.
split_func<-function(char,ref,name,start,end){
res<-data.table("ID" = 1:length(char))
for(i in 1:nrow(ref)){
res[,ref[[name]][i] := substr(x = char,start = ref[[start]][i],stop = ref[[end]][i])]
}
return(res)
}
Я создал те же входные файлы, что и вы:
templines<-c("201801 1 78","201801 2 67","201801 1 13")
dictionary<-data.table("col_name" = c("year","week","gender","age"),"col_start" = c(1,5,8,11),
"col_end" = c(4,6,8,13))
# col_name col_start col_end
#1: year 1 4
#2: week 5 6
#3: gender 8 8
#4: age 11 13
Что касается аргументов,
char
- Вектор символов со значениями, которые вы хотите разделить
ref
- Справочная таблица или словарь
name
- Номер столбца в справочной таблице, содержащий имена столбцов, которые вы хотите
start
- Номер столбца в справочной таблице, содержащий начальные точки
end
- Номер столбца в справочной таблице, содержащий точки останова
Если я использую эту функцию с этими входами, я получаю следующий результат:
out<-split_func(char = templines,ref = dictionary,name = 1,start = 2,end = 3)
#>out
# ID year week gender age
#1: 1 2018 01 1 78
#2: 2 2018 01 2 67
#3: 3 2018 01 1 13
Мне пришлось включить столбец «ID», чтобы инициировать таблицу данных и сделать это проще. Если вы захотите удалить его позже, вы можете просто использовать:
out[,ID := NULL]
Надеюсь, это ближе к решению, которое вы искали.