логический запрос к смешанной (символьной и числовой) переменной

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

LAMBDA<-data.frame(cbind(list(1,"lequiv"),list("lequiv",0)))
LAMBDA!=1

Как лучше всего добиться этого, чтобы строки символов, которые явно не равны 1, отображались как ЛОЖЬ, а не как НД? Спасибо.


person Charlie    schedule 18.06.2013    source источник
comment
Примечание: я бы избавился от привычки создавать фреймы данных через data.frame(cbind()). Это ужасная идиома, которая часто не делает то, что вы планировали.   -  person joran    schedule 18.06.2013
comment
Можете ли вы объяснить, почему Джоран, и есть ли такой же лаконичный подход? В данном случае это фактически аргумент для другой функции, поэтому лаконичность особенно полезна :)   -  person Charlie    schedule 19.06.2013
comment
Что ж, в этом все крайне необычно. Фреймы данных могут содержать списки в виде столбцов, но это обычно не одобряется, поскольку многие, многие функции, принимающие фреймы данных, неявно принимают столбцы одного типа. Так что если у вас действительно есть фрейм данных со столбцами списка (а я очень сомневаюсь, что у вас есть), то это, вероятно, хороший способ его создать; но эту идиому никогда не следует использовать в каких-либо других обстоятельствах.   -  person joran    schedule 19.06.2013
comment
да конечно. В данном случае это самый простой / наиболее эффективный способ ввода данных пользователем пакета, и мне просто нужно иметь дело с несколькими проблемами, разрывая его.   -  person Charlie    schedule 19.06.2013
comment
Зачем заставлять это быть фреймом данных? Фреймы данных - это просто частные случаи списков. Было бы более прозрачно и легче для понимания пользователей, если бы вы просто использовали список списков.   -  person joran    schedule 19.06.2013
comment
в идеале это матрица с несколькими строками символов, которые я могу вытащить. Пользователь указывает серию матриц (для использования в матричных вычислениях) и некоторые дополнительные ограничения. Вместо того, чтобы заставлять их указывать матрицу значений и в основном / полностью пустую матрицу ограничений (меток), они определяют единую структуру, подобную матрице, и список значений для любых включенных ограничений (символьные строки).   -  person Charlie    schedule 19.06.2013
comment
Ваш последний комментарий для меня почти не имеет смысла. Конечно, ничто в нем даже удаленно не поддерживает вставку этого во фрейм данных, когда списков было бы достаточно.   -  person joran    schedule 19.06.2013
comment
матричная структура имеет решающее значение для интерпретируемости. Альтернативный вариант, настоящая матрица и соответствующий фрейм данных, состоящий в основном из NA с несколькими символьными строками, может оказаться предпочтительным для ясности, даже если его указать сложнее. (пытался переместить это в чат, но это не позволило мне)   -  person Charlie    schedule 19.06.2013


Ответы (2)


Вместо проверки элементов, равных числу 1, вы можете попробовать проверить элементы, равные строке «1». Например:

> LAMBDA!="1"
        X1   X2
[1,] FALSE TRUE
[2,]  TRUE TRUE

в то время как:

> LAMBDA!=1
        X1   X2
[1,] FALSE   NA
[2,]    NA TRUE

В первом случае R достаточно умен, чтобы преобразовать значение 1 в вашем фрейме данных в строку перед проверкой эквивалентности. Во втором случае он не может принудить "lequiv" к проверке эквивалентности числа и поэтому возвращает NA (и предупреждающее сообщение).

person CnrL    schedule 18.06.2013
comment
Мне нравится этот ответ из-за его простоты, но мне интересно, есть ли более явный способ реализации логики - мое первое впечатление заключалось в том, чтобы проверить, были ли элементы числовыми (или не символом), но этот метод не работает b / c class() возвращает список. Однако классы в списке показаны в str(). - person rbatt; 18.06.2013
comment
Я не думаю, что особенно полезно приписывать R. расплывчатую сообразительность. Было бы лучше обсудить, как отправляется класс функций Ops и какое принуждение выполняется. - person IRTFM; 18.06.2013

Я думаю, вы ищете здесь факторы.

Если вы посмотрите на str(LAMBDA), вы увидите, что X1 - это список с двумя элементами, один из которых хранится как числовой, а другой как символьный.

Если вместо этого вы создадите свой список следующим образом:

l1 <- data.frame(X1=c(1,"lequiv"),
                 X2=c("lequiv",2)
                  )

при печати он будет выглядеть точно так же, но переменные представлены как факторы.

Тогда l1==1 дает:

        X1    X2
[1,]  TRUE FALSE
[2,] FALSE FALSE
person dardisco    schedule 18.06.2013
comment
Мммм ... было бы неплохо, если бы операция выполнялась напрямую, как ожидалось, но прав ли я, предполагая, что другие проблемы возникают из-за того, что длинный список непрерывных чисел (то есть определенно не отдельных уровней фактора) интерпретируется как уровни? Или это проблема только в том случае, если я хотел использовать факторы где-то еще в моей структуре данных? - person Charlie; 19.06.2013
comment
Не уверен, что понимаю - вы пытаетесь сохранить list как элемент в data.frame? Можно сделать - см. здесь но, конечно, вы не можете принудить list к double, чтобы использовать оператор ==. Рад, что вы нашли что-то, что сработало. - person dardisco; 20.06.2013