2015-07-23 3 views
0

Я работаю с R версии i386 3.1.1 и RStudio 0.99.442.Уровни печати фактора, присутствующего в выбранных критериях, а не всех уровней фактора в R?

У меня есть большие наборы данных видов деревьев, которые я собрал из 7 графиков, каждый из которых разделен на 5 подзаговоров (т. Е. 35 отдельных подзаговоров). Я пытаюсь заставить R запустить свой набор данных и распечатать вид, который присутствует в каждом сюжете.

Я думал, что могу использовать «агрегат» для применения функции «уровней» к столбцу данных «Виды» и вернуть его для каждого графика и подзаголовка, однако он возвращает уровни всего кадра данных (для 12 виды, всего), а не 3 или 4 вида, которые действительно присутствуют в подзаголовке.

Чтобы обеспечить воспроизводимый пример того, что я пытаюсь сделать, мы можем использовать «warpbreaks» набор данных, который поставляется с R.

преобразовать переменной «» Перерывы в warpbreaks к факторного воссоздавать проблема; Это, таким образом, иллюстрирует мою переменную вида, тогда как «warpbreaks $ wool» будет представлять «сюжет», а «warpbreaks $ tension» будет представлять «subplot».

require(stats) 
warpbreaks$breaks = as.factor(warpbreaks$breaks) 
aggregate(breaks ~ wool + tension, data = warpbreaks, FUN="levels") 

Если посмотреть на данные warpbreaks, то для "Участок" А (шерсти) и "сюжетные" L (растяжение) - желаемый сценарий будет печатать вида «26, 30, 54, 25, и т.д. «.

breaks wool tension 
1  26 A  L 
2  30 A  L 
3  54 A  L 
4  25 A  L 
5  70 A  L 
6  52 A  L 
7  51 A  L 
8  26 A  L 
9  67 A  L 
10  18 A  M 
11  21 A  M 
12  29 A  M 
... 

Вместо R возвращает что-то в этом роде, где он печатает все уровни переменного фактора для всех участков:

wool tension breaks.1 breaks.2 breaks.3 breaks.4 breaks.5 breaks... 
1 A  L  10  12  13  14  15  ...  
2 B  L  10  12  13  14  15  ...  
3 A  M  10  12  13  14  15  ...  
4 B  M  10  12  13  14  15  ...  
5 A  H  10  12  13  14  15  ...  
6 B  H  10  12  13  14  15  ...  

Как заставить его печатать только факторы, которые присутствуют в этой комбинации Plot/Subplot? Я полностью отключаюсь от использования «агрегата»? Я бы предположил, что это относительно простая задача для опытного пользователя R ...

Впервые postoverflow post - оценит любую помощь или подтолкнет вас к правильному коду!

Многие добрые благодарности.

ответ

1

Попробуйте FUN=unique, а не FUN=levels. levels вернет каждый уровень фактора, как вы уже догадались. unique(...) вернет только уникальные уровни.

y <- aggregate(breaks ~ wool + tension, data = warpbreaks, FUN=unique) 
    wool tension       breaks 
1 A  L 14, 18, 29, 13, 31, 28, 27, 30 
2 B  L 15, 4, 17, 9, 19, 23, 10, 26 
3 A  M  8, 11, 17, 7, 2, 20, 18, 21 
4 B  M 24, 14, 9, 6, 22, 16, 11, 17 
5 A  H 21, 11, 12, 8, 1, 25, 16, 5, 14 
6 B  H  10, 11, 12, 7, 3, 5, 6, 16 

Примечаниеbreaks колонка немного странно, так как в каждой строке этого столбца вместо одного значения (которое имеет смысл для dataframe), то есть вектор значений. то есть каждая ячейка этого столбца breaks НЕ является строкой; это вектор!

> class(y$wool) 
[1] "factor" 
> class(y$breaks) # list !! 
[1] "list" 
> y$breaks[[1]] # first row in breaks 
[1] 26 30 54 25 70 52 51 67 
Levels: 10 12 13 14 15 16 17 18 19 20 21 24 25 26 27 28 29 30 31 35 36 39 41 42 43 44 51 52 54 67 70 

Обратите внимание, что для доступа к первому элементу breaks колонны, вместо того, чтобы делать y$breaks[1] (как вы бы с колонкой wool или tension) вам нужно сделать y$breaks[[1]] из-за этого.

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

Если вы хотите конвертировать в строку, используйте (например) FUN=function (x) paste(unique(x), collapse=', '); то y$breaks будет столбцом строк и будет вести себя как обычно.

+0

Отлично! Спасибо, добавленная информация очень полезна. – jbukoski

Смежные вопросы