2015-11-18 4 views
-2

В рамках проекта в настоящее время я использую R для анализа некоторых данных. В настоящее время я застрял в извлечении нескольких значений из существующего набора данных, который я импортировал из файла csv.Обработка данных в R

файл выглядит следующим образом:

enter image description here

Для моего анализа, я хотел создать еще один столбец, который является вычитанием текущего значения x и его предыдущего значения. Но первое значение каждого уникального i, x будет таким же, как и в настоящее время. Я новичок в R, и я иногда пытаюсь по-разному, но все еще не в состоянии понять, как это сделать. Запросите свои предложения в подходе, который я могу выполнить для достижения этой задачи.

MyData структура

structure(list(t = 1:10, x = c(34450L, 34469L, 34470L, 34483L, 
34488L, 34512L, 34530L, 34553L, 34575L, 34589L), y = c(268880.73342868, 
268902.322359863, 268938.194698248, 268553.521856105, 269175.38273083, 
268901.619719038, 268920.864512966, 269636.604121984, 270191.206593437, 
269295.344751692), i = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L)), .Names = c("t", "x", "y", "i"), row.names = c(NA, 10L), class = "data.frame") 
+0

Пожалуйста, обратите внимание чтение на [просить], и как создать [воспроизводимый пример в R] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Это облегчает другим помощь вам. По крайней мере, включите свои данные в формат, который легко импортируется, ваш желаемый результат и то, что вы уже пробовали самостоятельно. – Heroka

+0

вы хотите, чтобы вычисления были сделаны для каждого уникального 'i', но в вашем примере данных есть только одно уникальное значение' i' ... – Cath

+0

MyData - это набор данных из 24000 строк, где значения i варьируются от 1 до 10. для каждого значение i имеет 2400 строк. как 24 часа данных за 100 дней. –

ответ

2

Вы можете использовать пакет data.table, чтобы получить то, что вы хотите:

library(data.table) 
setDT(MyData)[, x_diff := c(x[1], diff(x)), by=i] 
MyData 
    # t  x i x_diff 
# 1: 1 34287 1 34287 
# 2: 2 34789 1 502 
# 3: 3 34409 1 -380 
# 4: 4 34883 1 474 
# 5: 5 34941 1  58 
# 6: 6 34045 2 34045 
# 7: 7 34528 2 483 
# 8: 8 34893 2 365 
# 9: 9 34551 2 -342 
# 10: 10 34457 2 -94 

данных:

set.seed(123) 
MyData <- data.frame(t=1:10, x=sample(34000:35000, 10, replace=T), i=rep(1:2, e=5)) 
+0

Спасибо CathG, это может быть хорошей отправной точкой для меня. –

0

Вы можете использовать функцию diff(). Если вы хотите добавить новый столбец в существующий кадр данных, функция diff вернет векторную длину x-1 вашего текущего кадра данных. так что в вашем случае вы можете попробовать это:

# if your data frame is called MyData 
MyData$newX = c(NA,diff(MyData$x)) 

Это должно вход значение NA в качестве первой записи в вашем новом столбце, а остальные значения будет разностью между последовательными значениями в столбце «х»

UPDATE:

Вы можете создать простой цикл, Подменит через каждый уникальный экземпляр «я», а затем вычисление разности между вашим х значениями

# initialize a new dataframe 
newdf = NULL 
values = unique(MyData$i) 
for(i in 1:length(values)){ 
    data1 = MyData[MyData$i = values[i],] 
    data1$newX = c(NA,diff(data1$x)) 
    newdata = rbind(newdata,data1) 
} 

# and then if you want to overwrite newdf to your original dataframe 
MyData = newdf 

# remove some variables 
rm(data1,newdf,values) 
+0

Спасибо, Колин, я работаю над данным предложением. Я обновляю статус в какой-то момент. Спасибо –

Смежные вопросы