Выбор совпадающих значений строки из столбца (фрейм данных) для создания графиков с использованием цикла в R

У меня есть набор данных, который выглядит так,

species<-"ABC"
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
depth<-runif(length(ind),1,50)

df<-data.frame(cbind(species,ind,hour,depth))
df$depth<-as.numeric(df$depth)

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

Что я хотел бы сделать, так это иметь внешний цикл или функцию, которая будет выбирать все строки от каждого человека («ind») и генерировать блок-график, используя столбцы глубины/часа.

Это идея, которую я имею в виду,

for (i in 1:length(unique(df$ind))){

  data<-df[df$ind==df$ind[i],]
  individual[i]<-data

  plot.boxplot<-function(data){
  boxplot(depth~hour,dat=data,xlab="Hour of day",ylab="Depth (m)")

  }

}

par(mfrow=c(2,2),mar=c(5,4,3,1))
plot.boxplot(individual)

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


person user1626688    schedule 12.12.2012    source источник


Ответы (1)


Как насчет чего-то подобного?

par(mfrow=c(2,2))
invisible(
  by(df,df$ind,
    function(x)
      boxplot(depth~hour,data=x,xlab="Hour of day",ylab="Depth (m)")
    )
)

Чтобы дать некоторое объяснение, это запускает boxplot для каждой группы случаев в df определенных by df$ind. Оболочка invisible просто делает так, что набор вывода, используемый для boxplot, не записывается в консоль.

person thelatemail    schedule 12.12.2012
comment
Ух ты! Большое спасибо, это здорово! Один быстрый вопрос. Если я хочу включить имя каждого человека (например, ind 1, ind 2 и т. д.) в качестве заголовка, как лучше всего пойти. Я попытался включить main=paste(df$ind) внутри функции boxplot, но мне не дали название... - person user1626688; 12.12.2012
comment
@user1626688 user1626688 - попробуйте что-то вроде этого, заменив строку boxplot внутри приведенной выше функции: boxplot(depth~hour,data=x,xlab="Hour of day",ylab="Depth (m)",main=paste("ind=",x$ind[1],sep="")), и все будет готово. - person thelatemail; 12.12.2012
comment
Как вы думаете, вы можете выбрать два столбца при использовании функции by в приведенном выше коде. Например, не только выбор каждого человека, но и соответствующий столбец позволяет указать конкретный сезон для этого человека, в результате чего получается ящичковая диаграмма глубины в зависимости от часа дня для каждого сезона? - person user1626688; 12.12.2012
comment
@user1626688 user1626688 - вы можете получить доступ к любым переменным для группы один раз внутри функции by - см. мой ответ здесь: stackoverflow.com/questions/13792951/analyze-by-row-groups-in-r/ который, я считаю, будет хорошим руководством. - person thelatemail; 12.12.2012
comment
Но только по одной переменной за раз? Что, если я хочу получить доступ к информации о двух переменных (индивидуальном И сезоне), чтобы получить результаты, а не только об отдельных или только о сезоне? Мне нравится другой ваш пример, но я не уверен, отвечает ли он на мой вопрос. - person user1626688; 12.12.2012
comment
@user1626688 user1626688 - by работает как by(dataframe,vars.to.split.on,function), поэтому ваш пример будет by(df,df[c("ind","season")],function) - person thelatemail; 12.12.2012