2016-11-20 5 views
-1

Я работаю с файлом csv, и у меня есть столбец с именем «statistics_lastLocatedTime», как показано в csv file image Я бы хотел вычесть вторую строку «statistics_lastLocatedTime» из первой строки; третья строка из второго ряда и так далее до последней строки, а затем хранить все эти различия в отдельной колонке, а затем объединить эту колонку для других связанных столбцов, как показано в коде ниже:Как вычесть даты и хранить их в отдельной колонке?

##select related features 
data <- read.csv("D:/smart tech/store/2016-10-11.csv") 
(columns <- data[with(data, macAddress == "7c:11:be:ce:df:1d"), 
    c(2,10,11,38,39,48,50) ]) 
write.csv(columns, file = "updated.csv", row.names = FALSE) 

## take time difference 
date_data <- read.csv("D:/R/data/updated.csv") 
(dates <- date_data[1:40, c(2)]) 
NROW(dates) 
for (i in 1:NROW(dates)) { 
    j <- i+1 
    r1 <- strptime(paste(dates[i]),"%Y-%m-%d %H:%M:%S") 
    r2 <- strptime(paste(dates[j]),"%Y-%m-%d %H:%M:%S") 
    diff <- as.numeric(difftime(r1,r2)) 
    print (diff) 
} 

## combine time difference with other related columns 
combine <- cbind(columns, diff) 
combine 

Теперь проблема заключается в том, что я могу получить разницу в строках, но не могу сохранить эти значения в качестве столбца, а затем объединить этот столбец с другими соответствующими столбцами. пожалуйста помогите. заранее спасибо.

+0

Почему вы фильтруете свои «date_data' до первых 40 строк? Это не сможет вернуться к столбцам. – Parfait

+0

Фактически общее количество строк в macAddress == "7c: 11: be: ce: df: 1d" всего 40, и это не имеет значения, если я использую (даты <- date_data [1:40, c (2)]) или (даты <- date_data [, c (2)]). команды будут давать одинаковый вывод, т. е. все 40 строк, где macAddress == "7c: 11: be: ce: df: 1d" –

+0

Вы хотите вычислить diff в 'statistics_lastLocatedTime' и сохранить этот вектор обратно в фреймворке данных. – smci

ответ

1

Это четыре лайнера:

  1. Определение пользовательского класса «MyDate» и функцию преобразователя для вашего пользовательское время datetime, согласно Specify custom Date format for colClasses argument in read.table/read.csv
  2. Читайте в datetime как фактические даты; нет необходимости повторно конвертировать позже.
  3. Просто используйте векторный оператор diff на столбце даты (он видит их тип и автоматически отправляет функцию diff для дат POSIXct). Нет необходимости для петель:

.

setClass('myDate') # this is not strictly necessary 
setAs('character','myDate', function(from) { 
    as.POSIXct(from, format='%d-%m-%y %H:%S', tz='UTC') # or whatever timezone 
}) 

data <- read.csv("D:/smart tech/store/2016-10-11.csv", 
      colClasses=c('character','myDate','myDate','numeric','numeric','integer','factor')) 
# ... 
data$date_diff <- c(NA, diff(data$statistics_lastLocatedTime)) 

Обратите внимание, что diff() дает результат длины короче, чем один вектор, который мы diff'ed. Следовательно, мы должны заполнить его (например, с ведущим NA или любым другим, что вы хотите).

+0

Отличный ответ! Я добавляю 'setAs()' в свою библиотеку. Однако вам может понадобиться добавить 'setClass ('myDate')' else ошибка: * определение для класса myDate *. И как я пропустил 'diff()'? Обязательно исправьте конечную цитату * integer * в colClasses. – Parfait

+0

@Parfait no нам не нужно добавлять 'setClass ('myDate')'. Он отлично работает без – smci

+1

. Оказывается, это предупреждение, а не ошибка, но все еще обрабатывается, поскольку этот вопрос указывает: http://stackoverflow.com/questions/14146341/using-setas-to-specify-colclasses-in-r – Parfait

1

Рассмотрите возможность прямого назначения переменной diff с использованием vapply. Кроме того, нет необходимости в отдельном date_data df, так как все операции могут выполняться на столбцах df. Обратите внимание также изменение формата времени для выравнивания в формат в настоящее время в dataframe:

columns$diff <- vapply(seq(nrow(columns)), function(i){  
    r1 <- strptime(paste(columns$statistics_lastLocatedTime[i]),"%d-%m-%y %H:%M") 
    r2 <- strptime(paste(columns$statistics_lastLocatedTime[i+1]),"%d-%m-%y %H:%M") 

    diff <- difftime(r1, r2)  
}, numeric(1))