Nano Hash - криптовалюты, майнинг, программирование

применить добавляет место для логического

Возникла странная проблема с применением и R 3.0.1.

У меня есть огромный фрейм данных с текстом, числами и логическими значениями. Когда я использую apply, логические значения преобразуются в chr, но поскольку R допускает что-то вроде TRUE == "TRUE", это не проблема.

Но для некоторых логических значений apply, кажется, добавляет пробел, а TRUE == "TRUE" возвращает NA. Конечно, я мог сделать

sapply(cuelist[,4],FUN=function(logicalvalue) as.logical(sub("^ +", "", logicalvalue)))

но это неприятно, и я до сих пор не знаю, зачем R это делает.

df <- data.frame(test=c("a","b","<",">"),logi=c(TRUE,FALSE,FALSE,TRUE))
apply(df, MARGIN=1, function(listelement) print(listelement) )

Интересно, что пробелы появляются только в этом примере на [2,1] и [2,4].

версия _
платформа x86_64-w64-mingw32
архитектура x86_64
ОС mingw32
система x86_64, mingw32
статус
основной 3
второстепенный 0,1
2013 год
месяц 05
день 16
svn rev 62743
язык R
version.string R версия 3.0.1 (2013-05-16) ник Good Sport

Изменить: такое же поведение в версии R 2.15.0 (2012-03-30)

Edit2: Мои фреймы данных вроде этого

> df
  test  logi
1    a FALSE
2    b FALSE
3    <  TRUE
4    >  TRUE

> str(df)
'data.frame':   4 obs. of  2 variables:
 $ test: Factor w/ 4 levels "<",">","a","b": 3 4 1 2
 $ logi: logi  FALSE FALSE TRUE TRUE
04.09.2013

  • В комментариях нельзя использовать коды. Один момент, пожалуйста. 04.09.2013
  • @AnandaMahto См. Мой отредактированный пост. Спасибо за ваш ответ! 04.09.2013
  • Вы можете опубликовать вывод print(df, quote = TRUE)? 04.09.2013

Ответы:


1

В некотором смысле проблема связана с apply, но, что более уместно, проблема с as.matrix и тем, как он обрабатывает значения logical.

Вот несколько примеров, которые помогут уточнить мой запрос к Карлу.

Во-первых, давайте создадим четыре data.frame, чтобы провести несколько тестов.

  1. Ваш оригинальный data.frame для демонстрации поведения:
  2. data.frame с различным количеством символов в столбце «тест», чтобы изучить объяснение Карла того, что происходит.
  3. data.frame с некоторыми числами, чтобы помочь нам понять, что на самом деле происходит.
  4. data.frame, где явно создается столбец "logi" as.character.
df1 <- data.frame(test = c("a","b","<",">"),
                  logi = c(TRUE,FALSE,FALSE,TRUE))
df2 <- data.frame(test = c("aa","b","<",">>"), 
                  logi = c(TRUE,FALSE,FALSE,TRUE))
df3 <- data.frame(test = c("aa","b","<",">>"), 
                  logi = c(TRUE,FALSE,FALSE,TRUE),
                  num = c(1, 12, 123, 2))
df4 <- data.frame(test = c("aa","b","<",">>"), 
                  logi = as.character(c(TRUE,FALSE,FALSE,TRUE)))

Теперь давайте используем as.matrix для каждого из них.

Перед TRUE стоит пробел.

as.matrix(df1)
#      test logi   
# [1,] "a"  " TRUE"
# [2,] "b"  "FALSE"
# [3,] "<"  "FALSE"
# [4,] ">"  " TRUE"

Перед TRUE есть пробел, но столбец «test» не изменяется. Хм.

as.matrix(df2)
#      test logi   
# [1,] "aa" " TRUE"
# [2,] "b"  "FALSE"
# [3,] "<"  "FALSE"
# [4,] ">>" " TRUE"

Ах ... Здесь пробел перед TRUE и пробелом перед более короткими числами. Таким образом, кажется, что, возможно, R рассматривает числовое базовое значение TRUE и FALSE, но вычисляет ширину количества символов в TRUE и FALSE. Опять же, первый «тестовый» столбец остается неизменным.

as.matrix(df3)
#      test logi    num  
# [1,] "aa" " TRUE" "  1"
# [2,] "b"  "FALSE" " 12"
# [3,] "<"  "FALSE" "123"
# [4,] ">>" " TRUE" "  2"

Здесь все будет хорошо, если вы скажете R, что столбец logi является символьным.

as.matrix(df4)
#      test logi   
# [1,] "aa" "TRUE" 
# [2,] "b"  "FALSE"
# [3,] "<"  "FALSE"
# [4,] ">>" "TRUE" 

Как бы то ни было, у sapply, похоже, нет этой проблемы.

sapply(df1, as.matrix)
#      test logi   
# [1,] "a"  "TRUE" 
# [2,] "b"  "FALSE"
# [3,] "<"  "FALSE"
# [4,] ">"  "TRUE" 

Обновлять

В чате R Public Джошуа Ульрих указывает на format виновника. as.matrix использует as.vector для факторов, которые преобразуют их в символы (попробуйте str(as.vector(df1$test)), чтобы понять, что я имею в виду; для всего остального используется format, но, к сожалению, у него нет возможности включить какие-либо аргументы из format, один из которых trim (который по умолчанию установлен на FALSE).

Сравните следующее:

A <- c(TRUE, FALSE)

format(A)
# [1] " TRUE" "FALSE"
format(A, trim = TRUE)
# [1] "TRUE"  "FALSE"
format(as.character(A))
# [1] "TRUE " "FALSE"
format(as.factor(A))
# [1] "TRUE " "FALSE"

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

df1[sapply(df1, is.logical)] <- lapply(df1[sapply(df1, is.logical)], as.character)
df1
#   test  logi
# 1    a  TRUE
# 2    b FALSE
# 3    < FALSE
# 4    >  TRUE
as.matrix(df1)
#      test logi   
# [1,] "a"  "TRUE" 
# [2,] "b"  "FALSE"
# [3,] "<"  "FALSE"
# [4,] ">"  "TRUE" 
04.09.2013
  • Это очень мило! Благодаря этому я могу предварительно отредактировать фрейм данных, прежде чем он будет обработан с помощью apply / parApply. Тем не менее, я не думаю, что это подходящее поведение для фрейма данных в сочетании с функциями apply. Может, это действительно территория ошибок? Должен ли я или кто-нибудь опубликовать это в R-bugtracker? Возможно, у меня недостаточно опыта работы с R, чтобы понять положительную или полезную концепцию, лежащую в основе этого. 05.09.2013
  • Да, спасибо за ваши усилия, очень аналитические :) Я изменил всю свою кодовую базу, так что все приведенные логические списки в первую очередь являются строками. Не чувствую себя комфортно или правильно, но это работает. Мне не нужно замедлять процесс вычислений, обрезая каждый логический столбец, который у меня есть. 05.09.2013

  • 2

    Это определенно связано с применением, которое преобразует фрейм данных в матрицу, поэтому все элементы имеют один и тот же тип, здесь символ и логические элементы преобразуются в него. ИСТИНА преобразуется в "ИСТИНА", чтобы соответствовать количеству символов "ЛОЖЬ":

    "FALSE"
    " TRUE"
    

    Чтобы убедиться:

    as.matrix(df)
    

    Вместо этого вы можете использовать a * ply from plyr package, например

    a_ply(df, 1, print)
    
    04.09.2013
  • А теперь я понимаю. @AnandaMahto был прав, print (df, quote = TRUE) действительно добавляет пробелы, но я все еще мог сделать df [1,1] == TRUE. Есть ли другой способ, кроме plyr? Мне нужен parapply для параллельного пакета, который ведет себя так же. 04.09.2013
  • Вы действительно проверяли это на других примерах? Я не думаю, что это правильный ответ. 04.09.2013
  • Попробуйте свое объяснение на df1 <- data.frame(test=c("a","bb","<<",">"),logi=c(TRUE,FALSE,TRUE,TRUE)). Почему в первом столбце нет лишних пробелов? 04.09.2013
  • Да, это верно, но вы по-прежнему можете делать что-то вроде df1 [3,2] == TRUE, хотя это не работает в функции apply. 04.09.2013
  • plyr также предлагает распараллеливание с опцией .parallel 04.09.2013
  • Если вы действительно хотите, вы все равно можете использовать lapply: res ‹- lapply (seq_along (df), function (ci) {row‹ - df [ci,] lapply (row, print)}) 04.09.2013
  • @KarlForner, я попытался уточнить то, что наблюдал. Мне это кажется чем-то вроде территории ошибок. Я понимаю, что происходит с числовыми значениями при преобразовании символов, но не понимаю, почему они применяются так же, как и к логическим. 04.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..