Size: a a a

R language and Statistical data analysis

2019 November 29

Ю

Юрий 🐙💻🤖📊📈🚬 in R language and Statistical data analysis
)))))
источник
2019 December 01

IM

I M in R language and Statistical data analysis
Евгений Томилов
Как раз задумался, возможно ли написать Жизнь на R.
На R возможно написать всё
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Доброе утро!
Готовил домашнее задание для студентов по азам R, и столкнулся с такой странностью.
Допустим, у меня есть датафрейм df, я хочу создать в нем новую переменную alpha и записать в первую строчку значение 1. Однако команда
df$alpha[1] <- 1

заполняет 1 весь вектор alpha.
При этом
df[1,"alpha"] <- 1

работает корректно.
Мне кажется, эти строки должны приводить к одинаковому результату, но это не так.
Что я не понимаю?...
источник

DA

Dmitry Alyoshin in R language and Statistical data analysis
df$alpha это уже отдельный вектор, а не изначальный датафрейм
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Dmitry Alyoshin
df$alpha это уже отдельный вектор, а не изначальный датафрейм
Так я пишу не просто df$alpha, а df$alpha[1]
источник

DA

Dmitry Alyoshin in R language and Statistical data analysis
первый элемент отдельного вектора..
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Вот полный код, воспроизводящий ситуацию:
df <- data.frame(alpha = c(1,2,3),
                beta = c(1,2,3))
df$gamma[1] <- 1
View(df)
df$gamma[1] <- 2
View(df)
df[1,"delta"] <- 1
View(df)
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Dmitry Alyoshin
первый элемент отдельного вектора..
Правильно, и я хочу записать число в первый элемент отдельного вектора. С уже существующими векторами это работает правильно, но со вновь создаваемым - как-то странно. См. мой пример полного кода выше.
источник

A

Andrey in R language and Statistical data analysis
Дмитрий Козлов
Вот полный код, воспроизводящий ситуацию:
df <- data.frame(alpha = c(1,2,3),
                beta = c(1,2,3))
df$gamma[1] <- 1
View(df)
df$gamma[1] <- 2
View(df)
df[1,"delta"] <- 1
View(df)
ну вот так recycling работает.
df$gamma[1] <- 1

создается вектор gamma (как при вызове numeric()), добавляется один элемент (единичка), получается вектор длины 1, затем этот вектор дублируется нужное количество раз, чтобы соответствовать числу строк в таблице.
df[1,"delta"]

а тут изначально инициализируется вектор из NA нужной длины и в него пишется 1 в первую позицию
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Andrey
ну вот так recycling работает.
df$gamma[1] <- 1

создается вектор gamma (как при вызове numeric()), добавляется один элемент (единичка), получается вектор длины 1, затем этот вектор дублируется нужное количество раз, чтобы соответствовать числу строк в таблице.
df[1,"delta"]

а тут изначально инициализируется вектор из NA нужной длины и в него пишется 1 в первую позицию
Вот это и странно, что
df$gamma[1]
создает сначала вектор нулевой длины, а не длины других векторов в df.  В результате я вижу совсем не то, что прошу сделать... Для меня выглядит как баг, если честно.
источник

АК

Артём Клевцов in R language and Statistical data analysis
Дмитрий Козлов
Вот это и странно, что
df$gamma[1]
создает сначала вектор нулевой длины, а не длины других векторов в df.  В результате я вижу совсем не то, что прошу сделать... Для меня выглядит как баг, если честно.
А присваивать значения элементам несуществующеего вектора в твоей картине мира это адекватное явление?
источник

АК

Артём Клевцов in R language and Statistical data analysis
Достаточно создать вектор нужного типа (например, NA_character_), а затем уже производить какие-либо манипуляции.
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Артём Клевцов
А присваивать значения элементам несуществующеего вектора в твоей картине мира это адекватное явление?
Кстати, вполне. Фактически, я так регулярно делаю, записывая результат выполнения некоторой функции в новую переменную (что, как правило, создает ранее не существовавшие куда более сложные структуры). По крайней мере, в моей картине мира так.
источник

a

aGricolaMZ in R language and Statistical data analysis
Дмитрий Козлов
Кстати, вполне. Фактически, я так регулярно делаю, записывая результат выполнения некоторой функции в новую переменную (что, как правило, создает ранее не существовавшие куда более сложные структуры). По крайней мере, в моей картине мира так.
Возможно, что-то объяснит вот это:
> `[`(100:1, 1)
[1] 100
> `[`(100:1, 101)
[1] NA
> `$`(mtcars, mpg)
[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4
> `$`(mtcars, var_new)
NULL
> `[`(`$`(mtcars, var_new), 1)
NULL
источник

АК

Артём Клевцов in R language and Statistical data analysis
Дмитрий Козлов
Кстати, вполне. Фактически, я так регулярно делаю, записывая результат выполнения некоторой функции в новую переменную (что, как правило, создает ранее не существовавшие куда более сложные структуры). По крайней мере, в моей картине мира так.
То, что ты так делаеешь не говорит о том, что это нормально.
Подобным действием ты вызываешь разные имплицитные операции, которые могут вести себя по-разному в зависимости от вызова перегруженных операторов [<-.
источник

a

aGricolaMZ in R language and Statistical data analysis
Т. е. как я вижу, пока переменная не создана, она NULL вне зависимости от вызова [,  получается, что mpg$var_new не отличается от mpg$var_new[1], а дальше уже приписование векторизовано
источник

АК

Артём Клевцов in R language and Statistical data analysis
> lobstr::ast(df$b[1] <- 2)
█─`<-`
├─█─`[`
│ ├─█─`$`
│ │ ├─df
│ │ └─b
│ └─1
└─2
> lobstr::ast(df[1, "c"] <- 2)
█─`<-`
├─█─`[`
│ ├─df
│ ├─1
│ └─"c"
└─2

[ - в первом случае относится к вектору - во втором случае к data.frame.
источник

ДК

Дмитрий Козлов in R language and Statistical data analysis
Артём Клевцов
> lobstr::ast(df$b[1] <- 2)
█─`<-`
├─█─`[`
│ ├─█─`$`
│ │ ├─df
│ │ └─b
│ └─1
└─2
> lobstr::ast(df[1, "c"] <- 2)
█─`<-`
├─█─`[`
│ ├─df
│ ├─1
│ └─"c"
└─2

[ - в первом случае относится к вектору - во втором случае к data.frame.
Ага, спасибо, вот теперь стало понятно!
источник

АК

Артём Клевцов in R language and Statistical data analysis
И да, $ для data.frame интерпретирует его как список и извлекает элемент с потерей атрибута родительского объекта и ожидать от него аналогичного поведения с [.data.frame не стоит.
источник

АК

Артём Клевцов in R language and Statistical data analysis
Это точно не баг, а особенность поведения при перегрзуке оператора.
источник