R итерационная оптимизация - PullRequest
1 голос
/ 25 марта 2020

Привет, я новичок в R и мне нужна помощь с оптимизацией кода.

У меня есть фрейм данных, я хочу установить значение bool, если есть изменение значения из предыдущей строки.

Пример ниже, кажется, работает, но есть ли лучший / более читаемый способ написания этого кода?

Возможно, это потому, что я новичок в R, но я нахожу синтаксис df [,] a немного трудно понять.

# df is a dataframe with a c, which contains an integer value

df$changed = FALSE
c = 0
for ( i in 1:nrow(df)){
  if (df[i,]$c != c){
    c = df[i,]$c
    df[i,]$changed = TRUE
  }
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Мы можем сделать это несколькими способами:

Base R way:

df$changed <- c(FALSE, tail(df$c, -1) != head(df$c, -1))

dplyr

library(dplyr)
df %>% mutate(changed = y != lag(y, default = first(y)))

Или с помощью data.table

library(data.table)
setDT(df)[, changed := c != shift(c, fill = first(c))]
1 голос
/ 25 марта 2020

Мы можем сделать это векторизованным способом несколькими способами

1) base R

df$changed <- with(df, c(FALSE, c[-1] != c[-length(c)]))

Или с diff, если это число c

with(df, c(FALSE, diff(c) != 0))

2) с dplyr

library(dplyr)
df %>%
    mutate(changed = c(FALSE, diff(c) != 0))

Или, если это не число c

df %>%
   mutate(changed = c(FALSE, c[-1] != c[-n()]))

3) с data.table

library(data.table)
setDT(df)[, changed := c(FALSE, diff(c) != 0)]

или

setDT(df)[, changed := c(FALSE, c[-1] != c[-.N])]

data

df <- data.frame(c = c(1, 3, 3, 2, 1, 3, 4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...