У меня есть следующий фрейм данных df:

         cat  dog  cow   X   box  bag
trait1    0    0    0    1    0    0               
trait2    1    0    1    2    0    0
trait3    0    0    0    0    0    0
trait4    1    3    1    1    0    0
trait5    0    0    0    1    2    1
trait6    0    0    0    1    0    0
trait7    0    0    0    1    0    1
  1. Из df я хотел бы извлечь все признаки, для которых X уникален, в данном случае trait1 и trait6.
  2. Кроме того, я хотел бы выделить все черты, которые X уникальны для животных или предметов. Для животных: trait2 и trait4. Для объектов: trait5 и trait7

Я пробовал что-то вроде этого:

animals<-c('cat','dog','cow')
objects<-c('box','bag')
df[df[,animals]==0 & df[,objects]==0 & df[,X]>=1, ]   # To get traits unique for X
df[df[,animals]>=1 & df[,objects]==0 & df[,X]>=1, ]   # To get traits unique for X and animals
df[df[,animals]==0 & df[,objects]==1 & df[,X]>=1, ]   # To get traits unique for X and objects

Но все пошло не так, как планировалось.

0
Joran Martijn 3 Фев 2014 в 21:11
3
Не могли бы вы обновить свой пост желаемым результатом? Думаю, вам нужно уточнить критерии выбора. Например. в чем отличие «X» от «trait1» и «trait5»?
 – 
Henrik
3 Фев 2014 в 21:21
Моя ошибка, X был, конечно, уникальным для trait1 и trait6. Отредактировал сейчас
 – 
Joran Martijn
3 Фев 2014 в 21:37
В чем отличие «X» от «trait1» и «trait6»? Опять же, обновите свой пост желаемым результатом.
 – 
Henrik
3 Фев 2014 в 21:45

1 ответ

Лучший ответ

Более простая версия, те же результаты:

animal.trait <- apply(df[, animals], 1, any)
obj.trait <- apply(df[, objects], 1, any)

df[!(obj.trait | animal.trait) & df$X, ]
#        cat dog cow X box bag
# trait1   0   0   0 1   0   0
# trait6   0   0   0 1   0   0
df[animal.trait & df$X, ]
#        cat dog cow X box bag
# trait2   1   0   1 2   0   0
# trait4   1   3   1 1   0   0
df[obj.trait & df$X, ]
#        cat dog cow X box bag
# trait5   0   0   0 1   2   1
# trait7   0   0   0 1   0   1

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

Чтобы понять, почему ваша логика не работает, изучите свои временные условия. Например, в:

df[df[,animals]==0 & df[,objects]==0 & df[,X]>=1, ]

Если вы посмотрите на df[,animals]==0, вы получите:

#          cat   dog   cow
# trait1  TRUE  TRUE  TRUE
# trait2 FALSE  TRUE FALSE
# trait3  TRUE  TRUE  TRUE
# trait4 FALSE FALSE FALSE
# trait5  TRUE  TRUE  TRUE
# trait6  TRUE  TRUE  TRUE
# trait7  TRUE  TRUE  TRUE

Вероятно, это не то, что вы думали, что получаете. Предположительно вы надеялись получить вектор длины 7, а не эту матрицу. Чтобы получить вектор, вам нужно использовать apply для просмотра каждой строки и выполнения сравнений для каждой строки.


СТАРАЯ ВЕРСИЯ

Это должно делать то, что вы хотите, хотя я не понимаю, почему для первого вы включаете черту 5 вместо 6.

df[apply(df, 1, function(y) y["X"] >= 1 & all(y[names(y) != "X"] == 0)),]
df[apply(df, 1, function(y) any(y[animals]>=1) & !any(y[objects]>=1) & y["X"] >=1),]
df[apply(df, 1, function(y) any(y[objects]>=1) & !any(y[animals]>=1) & y["X"] >=1),]
0
BrodieG 3 Фев 2014 в 21:43
Спасибо, это здорово! Это именно то, что вы сказали.
 – 
Joran Martijn
4 Фев 2014 в 01:30
@JoranMartijn, если это отвечает на ваш вопрос, пометьте этот ответ как решение.
 – 
BrodieG
4 Фев 2014 в 01:46