R - создать новый столбец с ненулевым минимальным значением из нескольких столбцов - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь использовать tidyverse и dplyr для создания нового столбца, который является ненулевым минимумом для ряда других столбцов, или 0, если все столбцы равны 0. Упрощенный пример:

df <- data.frame(
  aa = c(0, 0, 0),
  bb = c(0, 1, 2),
  cc = c(2, 5, 3)
)

Новый столбец должен быть 2, 1 и 2. В этом случае работает следующий код, но он очень медленный для больших данных.

df2 <- df %>% 
  select(aa, bb, cc) %>% 
  rowwise() %>% 
  do( (.) %>% as.data.frame %>% mutate(minOver0 = ifelse(sum(.)==0,0,min(.[. > 0]))) ) %>%
  ungroup

Что можно сделать для ускоренияэто вверх?

1 Ответ

0 голосов
/ 02 марта 2019

Поскольку вы упомянули в комментариях, что у вас нет отрицательных значений, мы можем просто заменить нули в нашем столбце на NA, затем использовать pmin и затем заменить NA s на нули снова.Это будет работать, только если у вас нет NA s в остальной части вашей таблицы.

Я немного расширил ваш фрейм данных:

df <- data.frame(
  aa = c(0, 0, 0,0),
  bb = c(0, 1, 2,0),
  cc = c(2, 5, 3,0),
  dd = c(0,0,0,0)
)

Теперь наш результат должен быть:c (2,1,2,0)

Используя следующий код, мы добавляем столбец только из этих значений:

df3<-df  # copy the frame
df3[df3 == 0] <- NA # replace zeros by NA, replace by <0 if you want to ignore negative values too
# apply row-wise min function after removing NAs
df3<- df3%>% mutate(minover0= pmin(aa,bb,cc, na.rm = T)) 
df3[is.na(df3)] <- 0 # and return zeros, including the zero for the last (all-zero) row

Я не проверял это на скорость, но япредставьте, что это быстрее, чем rowwise() в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...