Возьмите две переменные из вектора структурированного символа и создайте фрейм данных - PullRequest
0 голосов
/ 19 февраля 2019

Давайте получим следующий вектор:

vector <- c("0:00 0,6 0:00", "5:00 1,2 5:00","9:30 0,9 22:00","16:00 1,0","21:30 0,9")

Мы видим, что этот элемент содержит:

часов, число (например, "0,6"), час2 (или пусто)

Кажется структурированным: после ":" всегда две цифры ("00" или "30"), затем "" и число с десятичной точкой (запятая).

Я хочу создать фрейм данных иполучить фрейм данных, содержащий первый час и номер, например:

#Expected result:
df
$hours $value
#0:00   0.6
#5:00   1.2
#9:30   0.9
#16:00  1.0
#21:30  0.9

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Попробуйте:

vec1<-sapply(strsplit(vector," "),"[")
df<-plyr::ldply(vec1,function(x) x[1:2])
names(df)<-c("hours","value")       
df$value<-gsub(",",".",df$value)

Результат:

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9
0 голосов
/ 19 февраля 2019

Другим забавным решением является использование word из пакета stringr, то есть

library(stringr)
data.frame(hours = word(vector, 1), 
           values = as.numeric(sub(',', '.', word(vector, 2), fixed = TRUE)), 
           stringsAsFactors = FALSE)

, что дает

  hours values
1  0:00    0.6
2  5:00    1.2
3  9:30    0.9
4 16:00    1.0
5 21:30    0.9
0 голосов
/ 19 февраля 2019

Вы можете попробовать:

data.frame(hours = sapply(strsplit(vector, " "), function(x) x[1]),
value = sapply(strsplit(vector, " "), function(x) x[2]))

  hours value
1  0:00   0,6
2  5:00   1,2
3  9:30   0,9
4 16:00   1,0
5 21:30   0,9

Он сначала разбивает вектор на strsplit(), затем объединяет первый и второй элемент в data.frame.

Если вы также хотите заменить запятую на десятичную:

data.frame(hours = sapply(strsplit(vector, " "), function(x) x[1]),
value = sub(",", ".", sapply(strsplit(vector, " "), function(x) x[2])))

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9

Она делает то же самое, что и код выше, но она также заменяет запятую во втором элементе на десятичную, используя sub().

Или:

df <- read.table(text = vector, sep = " ", dec = ",", as.is = TRUE, fill = TRUE)[, 1:2]
colnames(df) <- c("hours", "value")

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9

Преобразует вектор в data.frame с пробелом, используемым в качестве разделителя, и запятой, используемой в качестве десятичной дроби, а затем выбирает первые два столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...