Как заставить функцию R возвратить несколько столбцов и добавить их к кадру данных?

Я нахожу, что входящий в систему Java сбивает с толку, непоследователен, плохо зарегистрированный и особенно случаен. Кроме того, существует огромная сумма подобия между этими платформами журналирования, приводящими к дублированию усилия и беспорядку относительно того, в каком входе среды Вы находитесь на самом деле. В частности, если Вы работаете в серьезной стопке веб-приложения Java, Вы часто находитесь в приблизительно регистрирующиеся среды когда-то; (например, будьте в спящем режиме, может использовать log4j и кота java.util.logging). Свободное городское население Apache предназначено для образования моста различных платформ журналирования, но действительно просто добавляет больше сложности. Если Вы не знаете это заранее, это является совершенно озадачивающим. Почему мои сообщения журнала не распечатывают к консоли и т.д.? Ohh, потому что я смотрю на журналы Tomcat, и не log4j. Добавляя еще один слой сложности, сервер приложений может иметь глобальные конфигурации входа, которые не могут распознать локальные конфигурации для конкретного веб-приложения. Наконец, все эти платформы журналирования являются СЛИШКОМ СЛОЖНЫМИ. Входя в систему Java был неорганизованным отъездом путаницы разработчики как я разбитый и запутанный.

Ранние версии Java не имели встроенного продвижения платформы журналирования к этому сценарию.

5
задан Dan Goldstein 8 September 2009 в 17:43
поделиться

3 ответа

Возможно, вы захотите изменить функцию getNumberInfo , чтобы она возвращала список, а не вектор, чтобы значения могли иметь разные типы. Как бы то ни было, все они приводятся к строкам, что, вероятно, не то, что вам нужно для logX .

getNumberInfo <- function(x) {
  if(x %% 2 ==0) evenness = "Even" else evenness="Odd"
  if(x > 0) positivity = "Positive" else positivity = "NonPositive"
  if (positivity == "Positive") logX = log(x) else logX=NA
  list(evenness,positivity,logX)
}

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

getNumberInfo <- function(x) {
  list(evenness = if(x %% 2 ==0) "Even" else "Odd",
       positivity = if(x > 0) "Positive" else "NonPositive",
       logX = if(x > 0) log(x) else NA)
}

Тогда решение становится простым:

> cbind(myDF, t(sapply(myDF$Value, getNumberInfo)))
  Value evenness  positivity      logX
1    -2     Even NonPositive        NA
2    -1      Odd NonPositive        NA
3     0     Even NonPositive        NA
4     1      Odd    Positive         0
5     2     Even    Positive 0.6931472

Наконец, если вы используете ifelse (который может работать с векторами) вместо , если , он получает четное проще, потому что вам не нужно вызывать apply :

getNumberInfo <- function(x) {
  list(evenness = ifelse(x %% 2 ==0, "Even", "Odd"),
       positivity = ifelse(x > 0, "Positive", "NonPositive"),
       logX = ifelse(x > 0, log(x), NA))
}

> cbind(myDF, getNumberInfo(myDF$Value))
  Value evenness  positivity      logX
1    -2     Even NonPositive        NA
2    -1      Odd NonPositive        NA
3     0     Even NonPositive        NA
4     1      Odd    Positive 0.0000000
5     2     Even    Positive 0.6931472

Это последнее решение выдает предупреждение, потому что оно фактически вычисляет журнал каждого элемента, а не только тех, у которых x> 0 . Не уверен, что самый элегантный способ справиться с этим.

8
ответ дан 18 December 2019 в 13:16
поделиться

Как насчет:

 out <- cbind(myDF, t(apply(myDF, 1, getNumberInfo)))
 colnames(out) <- c('Value', 'Evenness', 'Positivity', 'Log')

Что дает:

  Value Evenness  Positivity               Log
1    -2     Even NonPositive              NA
2    -1      Odd NonPositive              NA
3     0     Even NonPositive              NA
4     1      Odd    Positive                 0
5     2     Even    Positive 0.693147180559945
3
ответ дан 18 December 2019 в 13:16
поделиться

Другой вариант:

> library(plyr)
> df <- mdply(myDF, getNumberInfo)
> names(df) <- c('Value', 'Evenness', 'Positivity', 'Log')
> df
  Value Evenness  Positivity       Log
1    -2     Even NonPositive        NA
2    -1      Odd NonPositive        NA
3     0     Even NonPositive        NA
4     1      Odd    Positive 0.0000000
5     2     Even    Positive 0.6931472
3
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

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