Size: a a a

R (язык программирования)

2020 December 06

ИП

Иван Поздняков... in R (язык программирования)
А как NSE штуки работают в data.table? Вот я, например, хочу удалить колонки, название которых хранится в векторе.
first_cols <- c("Sepal.Length", "Petal.Length")
iris_dt <- as.data.table(iris)

Я помню, что у дататейбла есть вот это вот .. (как нечто близкое !! в тайди, если я правильно понимаю). Я могу вытащить нужные колонки:
iris_dt[, ..first_cols]
Н
о все попытки присвоить NULL этим колонкам оканчиваются провалом
источник

PU

Philipp Upravitelev in R (язык программирования)
Иван Поздняков
А как NSE штуки работают в data.table? Вот я, например, хочу удалить колонки, название которых хранится в векторе.
first_cols <- c("Sepal.Length", "Petal.Length")
iris_dt <- as.data.table(iris)

Я помню, что у дататейбла есть вот это вот .. (как нечто близкое !! в тайди, если я правильно понимаю). Я могу вытащить нужные колонки:
iris_dt[, ..first_cols]
Н
о все попытки присвоить NULL этим колонкам оканчиваются провалом
> iris_dt[, (first_cols) := NULL]
> names(iris_dt)
[1] "Sepal.Width" "Petal.Width" "Species"
источник

ИП

Иван Поздняков... in R (язык программирования)
хм, просто скобочки поставить, и всего-то
источник

ИП

Иван Поздняков... in R (язык программирования)
спасибо!
источник

PU

Philipp Upravitelev in R (язык программирования)
Иван Поздняков
хм, просто скобочки поставить, и всего-то
это не очень прозрачно на первый взгляд, но, по сути, это модификация iris[, first_cols] <- NULL
просто для того, чтобы обратиться не к окружению dt-таблицы, а к окружению вызова (calling environment) необходимо представить first_cols в виде значения аргумента функции (, которая в том же глобальном рабочем окружении что и first_cols, если очень грубо
источник

A

Andrey in R (язык программирования)
Иван Поздняков
А как NSE штуки работают в data.table? Вот я, например, хочу удалить колонки, название которых хранится в векторе.
first_cols <- c("Sepal.Length", "Petal.Length")
iris_dt <- as.data.table(iris)

Я помню, что у дататейбла есть вот это вот .. (как нечто близкое !! в тайди, если я правильно понимаю). Я могу вытащить нужные колонки:
iris_dt[, ..first_cols]
Н
о все попытки присвоить NULL этим колонкам оканчиваются провалом
Все NSE в data.table сводится к упомянутым .., () и стандартной функции get(). В особо запущенных случаях можно использовать стандартные eval() и parse(), как описано в https://stackoverflow.com/questions/12391950/select-assign-to-data-table-when-variable-names-are-stored-in-a-character-vect/12392269#12392269
Есть еще вот такое обсуждение https://stackoverflow.com/questions/24833247/how-can-one-work-fully-generically-in-data-table-in-r-with-column-names-in-varia, полезное прежде всего коллекцией ссылок в начале
источник

E

Eкатерина in R (язык программирования)
Здравствуйте. Я генерирую данные для регрессии, в которой есть dummy variables.
Я бы хотела, чтобы 50% данных имели бы dummy=1, 50% dummy=0 в соответствии со следующим выражением:
D = I(α0 + α1 x + α2 z + e1 > 0)
Как я генерирую данные:
n<-100
set.seed(1111)
library(faux)
dat <- rnorm_multi(n,
                  mu = c(10000, 50000),
                  sd = c(1000, 5000),
                  r = c(0.35),
                  varnames = c("x", "z"),
                  empirical = FALSE)
dat_error<-rnorm_multi(n,
                      mu = c(0, 0),
                      sd = c(1, 1),
                      r = c(0.35),
                      varnames = c("e1", "e2"),
                      empirical = FALSE)

all_dat<-cbind(dat, dat_error)
a0<--2
a1<--1
a2<--7

D<- I(a0 + a1*all_dat$x + a2*all_dat$z + all_dat$e1 > 0)

D[1:5]
sum(D)

Когда я запускаю sum(D), то получаю, что все dummy либо True, либо False.
Я не могу понять, как именно я должна подобрать коэффициенты а0, а1,а2, чтобы получились dummy в правильном соотношении (50 % True и 50% False).
Подскажите, пожалуйста, как это сделать)
источник

IY

Igor Yegin in R (язык программирования)
e1 нормально распределено?
источник

E

Eкатерина in R (язык программирования)
Igor Yegin
e1 нормально распределено?
Да
источник

N

Nikolay in R (язык программирования)
a0 < 0
x всегда > 0, умножаем на a1 < 0, значит, a1*x < 0
z всегда > 0, умножаем на a2 < 0, значит a2*z < 0
e1 можно пренебречь, т.к. это число очень маленькое по сравнению с x и тем более z
И вообще в D можно пренебречь всем, кроме a2*z, т.к. z всегда сильно больше x и e1, а a2 меньше, чем a1 и a0. Т.е. в сумме у вас всегда здесь получится число сильно меньше 0 при таких параметрах.
Тут либо надо отнормировать x и z, либо сильно увеличить sd для e1
источник

IY

Igor Yegin in R (язык программирования)
Нужно, чтобы медиана α0 + α1 x + α2 z + e1 была равна нулю, тогда ровно 50% случайных величин по этой формуле будут больше или меньше 0.

Проще всего, если x, z нормально распределены, тогда их сумма также будет нормально распределена с матожиданием, равным сумме матожиданий x и z
источник

a

aGricolaMZ in R (язык программирования)
через 5 минут начинаем
источник

a

aGricolaMZ in R (язык программирования)
Переслано от aGricolaMZ
2020.12.06 в 16:00 будет следующая серия воскресного скRинкаста

https://zoom.us/j/97217774628?pwd=TXlvekhvMnplVW5KWFZYRjFNZFR0Zz09
источник

E

Eкатерина in R (язык программирования)
Igor Yegin
Нужно, чтобы медиана α0 + α1 x + α2 z + e1 была равна нулю, тогда ровно 50% случайных величин по этой формуле будут больше или меньше 0.

Проще всего, если x, z нормально распределены, тогда их сумма также будет нормально распределена с матожиданием, равным сумме матожиданий x и z
Я сделала сейчас, как Вы говорите. Теперь x и z имеют mean=0 sd=1.
но получается, что число  True False  колеблется от 50 до 61. Это из-за того, что числа рандомно генерируются, И если много-много раз генерировать, то будет в конце концов 50% True и False? Или я что-то неправильно делаю?
источник

IY

Igor Yegin in R (язык программирования)
Eкатерина
Я сделала сейчас, как Вы говорите. Теперь x и z имеют mean=0 sd=1.
но получается, что число  True False  колеблется от 50 до 61. Это из-за того, что числа рандомно генерируются, И если много-много раз генерировать, то будет в конце концов 50% True и False? Или я что-то неправильно делаю?
Попробуйте сгенерировать очень много таких величин. Хотя бы тысяч 100
источник

IY

Igor Yegin in R (язык программирования)
И посмотрите долю True или False
источник

E

Eкатерина in R (язык программирования)
Igor Yegin
Попробуйте сгенерировать очень много таких величин. Хотя бы тысяч 100
да, я сейчас попробовала сгенерировать 10000 и из них 5034 имеют True. Спасибо, мне стало яснее!
источник

a

aGricolaMZ in R (язык программирования)
Переслано от aGricolaMZ
Видео с встречи 2020.12.06 и код
источник

AS

Alexander Semenov in R (язык программирования)
Помог своей решить задачку на Stepik и со стыдом осознал, что не понимаю, почему это работает:
test_data <- as.data.frame(list(V1 = c(12, 10, 11, 10, 9, 9), 
                               V2 = c(11, 11, 9, 12, 10, 8),
                               V3 = c(11, 11, 10, 10, 10, 10),
                               V4 = c(11, 10, 9, 11, 11, 8),
                               V5 = c(10, 9, 9, 10, 10, 9),
                               V6 = c(12, 9, 9, 10, 10, 9),
                               V7 = c(11, 11, 12, 10, 9, 9),
                               V8 = c(9, 11, 10, 8, 11, 9),
                               V9 = c(12, 10, 10, 12, 10, 12),
                               V10 = c(13, 9, 9, 9, 10, 9)))



to_factors <- function(test_data, factors){
 fct = function(x) as.factor(ifelse(x > mean(x), 1, 0))
 test_data %>% mutate_at(factors, fct)
}
источник

AS

Alexander Semenov in R (язык программирования)
В частности не понимаю, как в функции fct х одновременно используется как 1 элемент вектора и как весь вектор целиком (при сравнении с mean(x))?
источник