2016-09-15 3 views
0
есть одна строка меньше

Если у меня есть образец данных, например mtcars, и я хочу найти разницу между mtcars $ qsec для всех строк, я могу сделать diff (mtcars $ qsec). Но есть ли простой способ сделать diff (mtcars $ qsec) новым столбцом в исходном кадре данных mtcars? Мне сложно, потому что есть еще одна строка в diff (mtcars $ qsec), чем остальные mtcars.Добавление нового столбца с функцией diff(), когда в R

> head(mtcars,3) 

       mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4  21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
+0

N номеров означает разницу N-1. Существует несколько разных способов сделать вектор длины N из значений N-1, а. Обычно 'c (NA, diff (x))' или аналогичный. – Frank

+0

Вижу, спасибо @Frank! – lg929

+0

Возможно, обман: http://stackoverflow.com/q/13594021/ – Frank

ответ

3

Вот два подхода. И положить NA в первом ряду diff_qsec и поставить diff(qsec) в остальных рядах:

library(dplyr) 
mtcars %>% mutate(diff_qsec = qsec - lag(qsec)) # dplyr has its own version of lag 

transform(mtcars, diff_qsec = c(NA, diff(qsec))) 

Кроме того, по общему вопросу заполнения см: How can I pad a vector with NA from the front?

1

Вы можете использовать базовую функцию в() как так:

mtcars <- within(mtcars, difference <- c(NA,diff(qsec))) 

Это создает столбец под названием «разница» с первым элементом NA, а остальные вычисленной Diff (qsec).

Вы можете создать несколько столбцов одновременно, обернув команды в {}, такие, как:

mtcars <- within(mtcars, {difference <- c(NA,diff(qsec)) 
         multiple <- qsec*2}) 

Обратите внимание, что вы должны использовать < - для задания и не =.

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

  • Нет связанных вопросов^_^