2013-08-08 4 views
0

Я пытаюсь использовать R, чтобы найти максимальное значение каждого дня в течение 1-го дня. Моя проблема в том, что в каждый день есть несколько значений. Вот мой код. После того, как я запустил неправильное количество измерений.R для цикла не работает

Любые предложения:

Days <- unique(theData$Date) #Gets each unique Day 
numDays <- length(Days)   
Time <- unique(theData$Time)  #Gets each unique time 
numTime <- length(Time) 
rowCnt <- 1 


for (i in 1:numDays) #Do something for each individual day. In this case find max 
    { 

     temp <- which(theData[i]$Date == numDays[i]) 
     temp <- theData[[i]][temp,] 
     High[rowCnt, (i-2)+2] <- max(temp$High) #indexing for when I print to CSV 
     rowCnt <- rowCnt + 1 
    } 

Вот что он должен выйти на: За исключением 1 до п дней и времени.

Day  Time  Value 
20130310 09:30:00 5 
20130310 09:31:00 1 
20130310 09:32:00 2 
20130310 09:33:00 3 
20130311 09:30:00 12 
20130311 09:31:00 0 
20130311 09:32:00 1 
20130311 09:33:00 5 
so this should return: 

day time value 
20130310 09:33:00 3 
20130311 09:30:00 12 

Любая помощь была бы принята с благодарностью! Благодаря!

+0

, который должен быть 5, а не 3 – Metrics

ответ

2

Вот решение, используя plyr пакет

mydata<-structure(list(Day = structure(c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L), .Label = c("", "x", "y"), class = "factor"), Value = c(0L, 
1L, 2L, 3L, 12L, 0L, 1L, 5L), Time = c(5L, 6L, 7L, 8L, 1L, 2L, 
3L, 4L)), .Names = c("Day", "Value", "Time"), row.names = c(NA, 
8L), class = "data.frame") 
library(plyr) 
ddply(mydata,.(Day),summarize,max.value=max(Value)) 

    Day max.value 
1 x   3 
2 y  12 

Updated1: Если ваш день говорят, 10/02/2012 12:00:00 AM, то вам нужно использовать:

mydata$Day<-with(mydata,as.Date(Day, format = "%m/%d/%Y")) 
ddply(mydata,.(Day),summarize,max.value=max(Value)) 

См., Например, here.

Обновлено 2: согласно новым данным: Если ваш день похож на тот, который вы обновили, вам не нужно ничего делать. Вы можете просто использовать код следующим образом:

mydata1<-structure(list(Day = c(20130310L, 20130310L, 20130310L, 20130310L, 
    20130311L, 20130311L, 20130311L, 20130311L), Time = structure(c(1L, 
    2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("9:30:00", "9:31:00", 
    "9:32:00", "9:33:00"), class = "factor"), Value = c(5L, 1L, 2L, 
    3L, 12L, 0L, 1L, 5L)), .Names = c("Day", "Time", "Value"), class = "data.frame", row.names = c(NA, 
    -8L)) 



ddply(mydata,.(Day),summarize,Time=Time[which.max(Value)],max.value=max(Value)) 
     Day Time max.value 
1 20130310 9:30:00   5 
2 20130311 9:30:00  12 

Если вы хотите, чтобы время, чтобы появиться на выходе, а затем просто использовать Time=Time[which.max(Value)], которая дает время на максимальное значение.

+0

Я получаю то же значение для каждого дня, когда я запускаю это. Скопировано точно. –

+0

Должен ли я писать цикл for, чтобы подключаться каждый день? –

+0

Нет, вам не нужно использовать 'for loop', когда то же самое можно легко обработать, применив функцию или друзей. – Metrics

-2

В отличие от других языков программирования, в R считается хорошей практикой избегать использования для циклов. Вместо того, чтобы попробовать что-то вроде:

index <- sapply(Days, function(x) { 
    which.max(Value) 
}) 
theData[index, c("Day", "Time", "Value")] 

Это означает, что для каждого значения Days, найти максимальное значение Value и возвращает его индекс. Затем вы можете выбрать интересующие строки и столбцы.

Я рекомендую прочитать справочную документацию для apply(), lapply(), sapply(), tapply(), mapply() (я, наверное, забыть одну из них ...) в и plyr пакет.

+0

По некоторым причинам я получаю неопределенные столбцы выбраны и когда я делаю индекс показывает: функция (х, ...) { метод UseMethod («Индекс») } <окружающая среда: пространство имен: зоопарк> любые предложения ? Приятно об этом узнать. спасибо –

+1

Было бы лучше использовать 'tapply' здесь:' tapply (Value, Days, which.max) ' –

+0

@DennisMo похоже, что' index' определен в среде как функция из пакета zoo. Поэтому, когда вы пытаетесь использовать его как переменную, R думает, что вы пытаетесь использовать эту функцию. Просто назовите это 'i' или что-то еще. – user12202013

1

Это базовая функция подход:

> do.call(rbind, lapply(split(dfrm, dfrm$Day), 
         function (df) df[ which.max(df$Value), ])) 
       Day  Time Value 
20130310 20130310 09:30:00  5 
20130311 20130311 09:30:00 12 

Чтобы объяснить, что происходит, это хорошо, чтобы научиться читать функции R изнутри Вы хотели линии от а (так как они часто строятся вокруг друг друга.) dataframe, так что вам нужно будет построить числовой или логический вектор, который охватывает количество строк, .... или вы можете выполнить маршрут, который я сделал, и сломать проблему на Day. Это то, что делает split с помощью dataframes. Затем в пределах каждого кадра данных я применил функцию, which.max, к одному подмножеству данных за один день. Поскольку я получил результаты только от lapply в качестве списка данных, мне нужно было сквоить их обратно вместе, и типичный метод для этого - do.call(rbind, ...).

Если бы я взял другой путь создания вектора для выбора, который применяется ко всему dataframe Я хотел бы использовать ave:

> dfrm[ with(dfrm, ave(Value, Day, FUN=function(v) v==max(v))) , ] 
     Day  Time Value 
1 20130310 09:30:00  5 
1.1 20130310 09:30:00  5 

да? Это неправильно ... В чем проблема?

with(dfrm, ave(Value, Day, FUN=function(v) v==max(v))) 
[1] 1 0 0 0 1 0 0 0 

Таким образом, несмотря просить логический вектор с помощью функции «==», я получил преобразование в цифровой вектор, то, что я до сих пор не понимаю. Но преобразования в логический вне этого результата мне удастся снова:

> dfrm[ as.logical(with(dfrm, ave(Value, Day, 
            FUN=function(v) v==max(v)))), ] 
     Day  Time Value 
1 20130310 09:30:00  5 
5 20130311 09:30:00 12 

отметить также, что функция ave (в отличие от tapply или aggregate) требует, чтобы вы предлагаете эту функцию в качестве именованного аргумента с FUN=function(.). Это обычная ошибка, которую я делаю. Если вы видите, что сообщение об ошибке уникально() применимо только к векторам ", оно кажется несовместимым, но означает, что ave попытался сгруппировать аргумент, который, как он ожидал, будет дискретным, и вы дали ему функцию.

+0

Я очень ценю ваши замечательные объяснения! – Henrik

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