Эффективно заменить все значения, превышающие 0, на 1 в массиве данных [дублировать]

Период используется для конкатенации строк. Простой пример, чтобы превратить две строковые переменные в одну переменную:

$full = $part1 . $part2;

В вашем примере вы хотели бы сделать:

$result = $data1 . ' ' . $data2;

Вы заметите, что я добавил строка одного пробела между двумя переменными. Это связано с тем, что ваш оригинал $data1 не закончился пробелом. Если бы вы объединили их без него, ваша переменная $result в итоге выглядела бы как the color isred.

19
задан Roland 10 November 2012 в 18:52
поделиться

2 ответа

Попробуйте преобразовать ваш df в матрицу.

df <- data.frame(a=rnorm(1000),b=rnorm(1000))
m <- as.matrix(df)
m[m<0] <- 0
df <- as.data.frame(m)
30
ответ дан Roland 21 August 2018 в 01:31
поделиться

Как ваш первоначальный подход, так и текущий ответ создают объект с тем же размером, что и m (или df) при создании m<0 (матричный подход быстрее, потому что меньше внутреннего копирования с [<- по сравнению с [<-.data.frame

Вы можете использовать lapply и replace, тогда вы смотрите только на вектор или length (nrow(df)) каждый раз и не копируете так много

df <- as.data.frame(lapply(df, function(x){replace(x, x <0,0)})

Если вы используете data.table, тогда большая часть неэффективности времени работы data.frame памяти (и) будет удалена. Это было бы идеально для большой ситуации с данными как ваш.

library(data.table)
# this really shouldn't be 
DT <- lapply(df, function(x){replace(x, x <0,0)})
# change to data.table
setattr(DT, 'class', c('data.table','data.frame'))
# or 
# DT <- as.data.table(df, function(x){replace(x, x <0,0)})

Вы можете установить ключи во всех столбцах, а затем заменить по ссылке на значения клавиш менее 0

21
ответ дан mnel 21 August 2018 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: