Как выбрать строки из data.frame с двумя условиями
У меня есть сводная таблица:
> 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"]
но отвечает на все 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"]
}
}
Любые предложения, которые еще проще и дают этот результат, я ценю!
Ответы
Ответ 1
Использовать, а не &. Последний оценивает только первый элемент каждого вектора.
Обновление:, чтобы ответить на вторую часть, используйте пакет reshape. Что-то вроде этого сделает это:
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().
Ответ 2
Самое простое решение - изменить "& &" "&" в вашем коде.
> 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
Ответ 3
Существует действительно полезный документ для подмножества кадров данных R:
http://www.ats.ucla.edu/stat/r/modules/subsetting.htm
Вот соответствующий отрывок:
Подмножество строк с использованием нескольких условные утверждения: нет ограничить количество логических выражений могут быть объединены для достижения требуемое подмножество. Данные frame x.sub1 содержит только наблюдения, для которых значения переменная y больше 2 и для которого переменная V1 больше чем 0,6.
x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)