Хотите изменить одну переменную условно на другую [дубликат]

вы можете добавить столбец md5 длинных столбцов

24
задан Julius Vainora 5 January 2013 в 13:25
поделиться

5 ответов

Возможно, вы хотите ifelse:

a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)

 [1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
 [9] 0.250 0.250
40
ответ дан user1317221_G 17 August 2018 в 11:00
поделиться

Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).

Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»

Best

9
ответ дан Atesh 17 August 2018 в 11:00
поделиться

if оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse. В вашем случае достаточно написать

w <- function(a){
if (any(a>0)){
  a/sum(a)
}
  else 1
}

или короткую векторную версию

ifelse(a > 0, a/sum(a), 1)

. Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длина 1 (в остальной части) и ifelse дает выходной вектор длины, равный длине a.

32
ответ дан jem77bfp 17 August 2018 в 11:00
поделиться
  • 1
    почему о, почему, если все остальное в R-стране векторизовано ... «если» нет? Smdh. – Matt O'Brien 18 August 2015 в 02:23

Как я решал этот вопрос, когда я пытался сделать что-то подобное, когда я определял функцию, и он вызывался с массивом, как другие указывали

. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.

sapply(a, function(x) afunc(x))

afunc<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}
0
ответ дан rlhull6 17 August 2018 в 11:00
поделиться

Вот простой способ без ifelse:

(a/sum(a))^(a>0)

Пример:

a <- c(0, 1, 0, 0, 1, 1, 0, 1)

(a/sum(a))^(a>0)

[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
15
ответ дан Sven Hohenstein 17 August 2018 в 11:00
поделиться
  • 1
    Это превосходит ifelse примерно в 7 раз (на массиве элементов 100000). – Matthew Lundberg 5 January 2013 в 16:24
  • 2
    Полезно знать, @Arun +1 – Sven Hohenstein 5 January 2013 в 18:24
  • 3
    Не могли бы вы рекомендовать краткое объяснение / документацию этого оператора ^ (например, то, что он назвал и как он работает). Предпочтительно что-то более прямое, чем документация арифметических операторов ... – theforestecologist 13 November 2017 в 03:35
  • 4
    @theforestecologist Оператор ^ используется для возведения в степень. Команда x ^ y означает: x поднята до значения y. Код 2 ^ 3 будет вычислять 2 * 2 * 2. – Sven Hohenstein 13 November 2017 в 21:19
Другие вопросы по тегам:

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