Сравнить столбец по значению строки и сохранить наибольшее - PullRequest
0 голосов
/ 18 февраля 2019

В качестве входного фрейма данных

dframe <- structure(list(com = structure(1:2, .Label = c("col1", "em"), class = "factor"), 
    stock1 = c(2.6, 2.05), aim = c(1.55, 3.1)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -2L))

Как можно сравнить две строки в соответствии с двумя значениями в столбце значений для каждого другого столбца, сохранить наибольшее значение и вставить ноль в нижнее значение?

Вот пример ожидаемого выхода

> data.frame (com = c("col1","em"), stock1 = c(2.6, 0), aim = c(0,3.10))
   com stock1 aim
1 col1    2.6 0.0
2   em    0.0 3.1

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Если вы не вкладываете деньги при использовании tibble, но data.frame, вы можете сделать

dat <- as.data.frame(dframe)

cols <- c("stock1", "aim")
dat[, cols][cbind(1:nrow(dat),
                  max.col(-dat[, cols]))] <- 0 
dat
#   com stock1 aim
#1 col1    2.6 0.0
#2   em    0.0 3.1

Очевидно, вы не можете использовать матрицу для извлечения / замены значений из tibble.

0 голосов
/ 18 февраля 2019

Также возможна база R:

cbind(dframe[, 1], dframe[, -1] * apply(dframe[, -1], 1, function(x) x == max(x)))

   com stock1 aim
1 col1    2.6 0.0
2   em    0.0 3.1
0 голосов
/ 18 февраля 2019
for (i in 1:nrow(dframe)){
  min=which.min(dframe[i,-1])
  dframe[i,min+1]=0
}
> dframe
# A tibble: 2 x 3
  com   stock1   aim
  <fct>  <dbl> <dbl>
1 col1     2.6   0  
2 em       0     3.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...