Как выбрать строки из data.frame с 2 условиями - PullRequest
21 голосов
/ 08 октября 2009

У меня есть сводная таблица:

> aggdata[1:4,]
  Group.1 Group.2         x
1       4    0.05 0.9214660
2       6    0.05 0.9315789
3       8    0.05 0.9526316
4      10    0.05 0.9684211

Как выбрать значение x, если у меня есть значения для Group.1 и Group.2?

Я пытался:

aggdata[aggdata[,"Group.1"]==l && aggdata[,"Group.2"]==lamda,"x"]

но это отвечает всем х.

Дополнительная информация: Я хочу использовать это так:

table = data.frame();
for(l in unique(aggdata[,"Group.1"])) {
    for(lambda in unique(aggdata[,"Group.2"])) {
        table[l,lambda] = aggdata[aggdata[,"Group.1"]==l & aggdata[,"Group.2"]==lambda,"x"]
    }
}

Любые предложения, которые еще проще и дают этот результат, я ценю!

Ответы [ 3 ]

22 голосов
/ 08 октября 2009

Самое простое решение - заменить "&&" на "&" в вашем коде.

> aggdata[aggdata[,"Group.1"]==6 & aggdata[,"Group.2"]==0.05,"x"]
[1] 0.9315789

Мое предпочтительное решение - использовать subset ():

> subset(aggdata, Group.1==6 & Group.2==0.05)$x
[1] 0.9315789
13 голосов
/ 08 октября 2009

Используйте & не &&. Последний оценивает только первый элемент каждого вектора.

Обновление: , чтобы ответить на вторую часть, используйте пакет изменения формы. Что-то вроде этого сделает это:

tablex <- recast(aggdata, Group.1 ~ variable * Group.2, id.var=1:2)
# Now add useful column and row names
colnames(tablex) <- gsub("x_","",colnames(tablex))
rownames(tablex) <- tablex[,1]
# Finally remove the redundant first column
tablex <- tablex[,-1]

Кто-то с большим опытом работы с изменением формы может иметь более простое решение.

Примечание. Не используйте таблицу в качестве имени переменной, поскольку оно конфликтует с функцией table ().

8 голосов
/ 16 января 2010

Существует очень полезный документ по поднабору R-кадров данных по адресу: http://www.ats.ucla.edu/stat/r/modules/subsetting.htm

Вот соответствующая выдержка:

Подстановка строк с использованием нескольких условные высказывания: нет ограничить количество логических утверждений могут быть объединены для достижения подмножество, которое желательно. Данные кадр x.sub1 содержит только наблюдения, для которых значения переменная у больше 2 и для которого переменная V1 больше чем 0,6.

x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...