Найдите самое высокое значение и замените нижнее на ноль - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть фрейм данных: dframe <- structure(list(label = c("col1", "aim"), text1 = c(0, 0.00900990099009901), rwr = c(0, 0), ff = c(0, 0.0120792079207921), ff = c(0, 0.0204950495049505), dfdv = c(0, 0), wef = c(0, 0), cv = c(0, 0.588019801980198), vvf = c(0, 0), dsf = c(0, 0.0134653465346535), dfd = c(0, 0.0134653465346535), dfdsc = c(0, 0.0226732673267327), cxvd = c(0, 0.0226732673267327), icu = c(-0.4290625, 0.361831683168317), vcx = c(-0.0684375, 0.105693069306931), asd = c(0, 0.0864851485148515), dsa = c(-0.480625, 0.676287128712871), sd = c(0, 0), dfde = c(0, 0), dcfvdc = c(0, 0), ccdd = c(0, 0), fvcdc = c(0, 0.0169306930693069), vdf = c(0, 0), vdf = c(0, 0), fdv = c(0, 0), vdfv = c(0, 0), fvvr = c(-0.333125, 1.41455445544554), fev = c(0, 0), fverf = c(0, 0), vfd = c(0, 0.0361881188118812), fev = c(0, 0), wtfpl = c(0, 0), erfe = c(0, 0)), row.names = c(NA, -2L), class = "data.frame")

И с помощью этого я хочу сравнить значения в каждом столбце и сохранить большее значение, т.е. -0,4 и 0,3, сохранить -0,4 (абсолютное значение), но в некоторых случаях этоне работает.Почему это происходит?

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

Ожидаемый результат:

dframe_ex <- structure(list(label = c("col1", "aim"), text1 = c(0, 0.00900990099009901), rwr = c(0, 0), ff = c(0, 0.0120792079207921), ff = c(0, 0.0204950495049505), dfdv = c(0, 0), wef = c(0, 0), cv = c(0, 0.588019801980198), vvf = c(0, 0), dsf = c(0, 0.0134653465346535), dfd = c(0, 0.0134653465346535), dfdsc = c(0, 0.0226732673267327), cxvd = c(0, 0.0226732673267327), icu = c(-0.4290625, 0), vcx = c(0, 0.105693069306931), asd = c(0, 0.0864851485148515), dsa = c(0, 0.676287128712871), sd = c(0, 0), dfde = c(0, 0), dcfvdc = c(0, 0), ccdd = c(0, 0), fvcdc = c(0, 0.0169306930693069), vdf = c(0, 0), vdf = c(0, 0), fdv = c(0, 0), vdfv = c(0, 0), fvvr = c(0, 1.41455445544554), fev = c(0, 0), fverf = c(0, 0), vfd = c(0, 0.0361881188118812), fev = c(0, 0), wtfpl = c(0, 0), erfe = c(0, 0)), row.names = c(NA, -2L), class = "data.frame")
> dframe_ex
  label         text1 rwr           ff           ff dfdv wef          cv vvf          dsf          dfd        dfdsc
1  col1 0.00000000000   0 0.0000000000 0.0000000000    0   0 0.000000000   0 0.0000000000 0.0000000000 0.0000000000
2   aim 0.00900990099   0 0.0120792079 0.0204950495    0   0 0.588019802   0 0.0134653465 0.0134653465 0.0226732673
          cxvd        icu         vcx          asd         dsa sd dfde dcfvdc ccdd        fvcdc vdf vdf fdv vdfv       fvvr
1 0.0000000000 -0.4290625 0.000000000 0.0000000000 0.000000000  0    0      0    0 0.0000000000   0   0   0    0 0.00000000
2 0.0226732673  0.0000000 0.105693069 0.0864851485 0.676287129  0    0      0    0 0.0169306931   0   0   0    0 1.41455446
  fev fverf          vfd fev wtfpl erfe
1   0     0 0.0000000000   0     0    0
2   0     0 0.0361881188   0     0    0

1 Ответ

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

Проблемы в вашем подходе:

  1. Вы говорите, что хотите сделать сравнение для каждого столбца .apply с MAR = 1 применяется к строкам .Мы изменим это значение на MAR = 2 для перехода по столбцам.

  2. Вы упоминаете "абсолютные значения" в своем тексте, но не используете abs() в своем коде.Мы добавим его.

  3. Вывод apply будет nx 2, нам нужно транспонировать его, чтобы сделать его 2 x n.

Это приводит нас сюда:

cbind(dframe[, 1], dframe[, -1] * t(apply(dframe[, -1], 2, function(x) abs(x) == max(abs(x)))))
#   dframe[, 1]       text1 rwr         ff       ff.1 dfdv wef cv vvf        dsf        dfd      dfdsc
# 1        col1 0.000000000   0 0.00000000 0.00000000    0   0  0   0 0.00000000 0.00000000 0.00000000
# 2         aim 0.009009901   0 0.01207921 0.02049505    0   0  0   0 0.01346535 0.01346535 0.02267327
#         cxvd        icu        vcx        asd        dsa sd dfde dcfvdc ccdd      fvcdc vdf vdf.1 fdv vdfv
# 1 0.00000000 -0.4290625 -0.0684375 0.00000000 -0.4806250  0    0      0    0 0.00000000   0     0   0    0
# 2 0.02267327  0.0000000  0.1056931 0.08648515  0.6762871  0    0      0    0 0.01693069   0     0   0    0
#        fvvr fev fverf        vfd fev.1 wtfpl erfe
# 1 -0.333125   0     0 0.00000000     0     0    0
# 2  1.414554   0     0 0.03618812     0     0    0

Я мог бы порекомендовать другой подход, написать служебную функцию и применить ее к каждому столбцу:

non_max_to_zero = function(x) {
    x[abs(x) != max(abs(x))] = 0
    return(x)
}
dframe[, -1] = lapply(dframe[, -1], non_max_to_zero)

Для того же результата.

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