Как применить функцию различий на тибле - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу применить diff к столбцу фрейма данных, получая к нему доступ по его имени.Я делаю следующее:

abscissa <- "distance"
data.op[, abscissa]

Я получаю этот вывод

# A tibble: 15 x 1
   distance
        <dbl>
 1     0.0426
 2     0.0409
 3     0.0412
 4     0.0406
 5     0.0406
 6     0.0407
 7     0.0402
 8     0.0403
 9     0.103 
10     0.0402
11     0.0395
12     0.0407
13     0.0406
14     0.0405
15     0.0404

Затем я просто пытаюсь:

 diff(data.op[, abscissa])

Но вывод:

 # A tibble: 15 x 0

Я также пытался data.op[, abscissa] %>% diff и data.op %>% select(abscissa) %>% diff с тем же результатом нулевого столбца.

Однако, если я делаю

diff(as.data.frame(data.op)[, abscissa])

Это работает:

[1] -0.00169560  0.00024120 -0.00061200  0.00000000  0.00013320 -0.00045360  0.00003240  0.06299047 -0.06306967 -0.00071640  0.00120960 -0.00007920
[13] -0.00010440 -0.00005400

Когда я набираю str(data.op), я получаю:

Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 15 obs. of  28 variables:
...

Чего я не понимаю, так это:

  • Почему мой фрейм данных является тибблом? Хорошо, я установил tidyverse, но никогда раньше не использовал его в этом фрейме данных.

Редактировать: Не верно, я использовал функцию mapvalues()чтобы создать фрейм данных, так что, я думаю, именно поэтому это тиббл, а не простой фрейм данных.

  • Мой data.op - это также фрейм данных,так почему же diff(data.op[, abscissa]) не работает?

  • Почему data.op[, abscissa] %>% diff и data.op %>% select(abscissa) %>% diff тоже не работают?

  • Есть ли у менядействительно нужно преобразовать его во фрейм данных, чтобы сделать простой diff?Это не помогает читабельности ...

Извините, я не могу привести более воспроизводимый пример.Я попытался с mtcars, и все работает, как ожидалось (но mtcars это фрейм данных, а не tibble).В какой-то момент мой фрейм данных data.op был преобразован в тиббл, но я понятия не имею, почему.

1 Ответ

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

Чтобы получить воспроизводимый пример с mtcars

library(tidyverse)
df <- as.tibble(mtcars)
abscissa <- "mpg"

Теперь, когда вы делаете

diff(df[, abscissa])
# A tibble: 32 x 0

, но

diff(mtcars[, abscissa])
#[1]   0.0   1.8  -1.4  -2.7  -0.6  -3.8  10.1  -1.6  -3.6  -1.4  -1.4   0.9
#[13]  -2.1  -4.8   0.0   4.3  17.7  -2.0   3.5 -12.4  -6.0  -0.3  -1.9   5.9
#[25]   8.1  -1.3   4.4 -14.6   3.9  -4.7   6.4

работает нормально.

Это потому, что

class(df[, abscissa])
#[1] "tbl_df"     "tbl"        "data.frame"

, тогда как

class(mtcars[, abscissa])
#[1] "numeric"

Теперь из ?diff

x - числовой вектор или матрица, содержащая значениябыть разным

Следовательно, он не работает с тибблами.

Вы можете сделать

df %>% pull(abscissa) %>% diff
# [1]   0.0   1.8  -1.4  -2.7  -0.6  -3.8  10.1  -1.6  -3.6  -1.4  -1.4   0.9
#[13]  -2.1  -4.8   0.0   4.3  17.7  -2.0   3.5 -12.4  -6.0  -0.3  -1.9   5.9
#[25]   8.1  -1.3   4.4 -14.6   3.9  -4.7   6.4

, начиная с

df %>% pull(abscissa) %>% class
#[1] "numeric"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...