У меня есть данные, которые выглядят следующим образом:
duration obs another
1 1.801760 ID: 10 DAY: 6/10/13 S orange
2 1.868500 ID: 10 DAY: 6/10/13 S green
3 0.233562 ID: 10 DAY: 6/10/13 S yellow
4 5.538760 ID:96 DAY: 6/8/13 T yellow
5 3.436700 ID:96 DAY: 6/8/13 T blue
6 0.533856 ID:96 DAY: 6/8/13 T pink
7 2.302250 ID:96 DAY: 6/8/13 T orange
8 2.779420 ID:96 DAY: 6/8/13 T green
Я включил только 3 переменные, хотя на самом деле в моих данных их много. Моя проблема связана с уродливой переменной «obs». Я получил эти данные от другого человека, который непоследовательно вводил эту информацию в используемое им программное обеспечение.
obs содержит три части информации: - идентификатор (ID: 10, ID: 96 и т. д.) - дата (M/D/Y) - идентификатор (S или T)
Я хочу разделить эту информацию и извлечь идентификационный номер (10 или 96), дату (например, 08.06.13) и идентификатор (S или T).
Для этого я попробовал следующее, используя strsplit:
temp<-strsplit(as.character(df$obs), " ")
mat<-matrix(unlist(temp), ncol=5, byrow=TRUE)
Я думал, что это будет работать, как и в моих реальных данных, у меня> 130 000 наблюдений, и я не осознавал, что в некоторых наблюдениях была проблема, из-за которой в идентификаторе не было пробела " " между "ID:" и числом. Например, в приведенных выше данных «ID:96» не содержит пробела между двоеточием и числом. Очевидно, я получил это предупреждающее сообщение:
Warning message:
In matrix(unlist(temp), ncol = 5, byrow = TRUE) :
data length [796454] is not a sub-multiple or multiple of the number of rows [159291]
Ясно, что strsplit не может быть приведен к правильным регулярным столбцам, поскольку вывод strsplit принимает две формы:
[1] "ID:" "10" "DAY:" "6/10/13" "S" #when there is whitespace
[1] "ID:96" "DAY:" "6/8/13" "T" #when there isn't whitespace
Чтобы попытаться обойти это, я сделал это, думая, что если бы я мог ввести пробел после «ID:», это могло бы работать:
df$obs <- gsub("ID:", "ID: ", df$obs)
Но это не сработало, так как когда я затем сделал strsplit, он распознал двойные пробелы как два места для разделения данных.
Если кто-нибудь знает решение для нескольких strsplits, которые затем можно вернуть обратно в исходный df с отдельными столбцами для идентификатора, даты, идентификатора, это было бы здорово.
редактировать: извините, забыл добавить данные для воспроизводимого примера:
df<-structure(list(duration = c(1.80176, 1.8685, 0.233562, 5.53876,
3.4367, 0.533856, 2.30225, 2.77942), obs = structure(c(1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L), .Label = c("ID: 10 DAY: 6/10/13 S",
"ID:96 DAY: 6/8/13 T"), class = "factor"), another = structure(c(3L,
2L, 5L, 5L, 1L, 4L, 3L, 2L), .Label = c("blue", "green", "orange",
"pink", "yellow"), class = "factor")), .Names = c("duration",
"obs", "another"), class = "data.frame", row.names = c(NA, -8L
))