Полученных вами ответов более чем достаточно, но для полноты я хотел бы добавить решение, объясняющее, как получить желаемый результат, начиная с вывода команды by
.Я собираюсь использовать слегка измененную версию примера Рамната для иллюстрации:
mydata = data.frame(
location = rep(LETTERS[1:3], each = 3),
sample = runif(9)
)
# DEFINE DUMMY FUNCTION - slightly different from ramnath's
myfunc = function(dat){
temp <- data.frame(x = runif(3), y = rnorm(3))
return(temp)
}
Вы разделяете данные на location
и применяете свою функцию, используя by
:
rs <- by(mydata,mydata$location,FUN = myfunc)
mydata$location: A
x y
1 0.2730105 -0.06923224
2 0.9354096 -0.18336131
3 0.6359926 -0.04054326
-----------------------------------------------------------
mydata$location: B
x y
1 0.5621529 -0.26404739
2 0.8098687 0.07912883
3 0.7334650 0.38287794
-----------------------------------------------------------
mydata$location: C
x y
1 0.8443924 -0.9055125
2 0.7922256 0.1757586
3 0.4923929 -0.1931579
Теперь очень удобно знать, что мы можем снова собрать все вместе, используя do.call
и rbind
:
result <- do.call(rbind,rs)
x y
A.1 0.2730105 -0.06923224
A.2 0.9354096 -0.18336131
A.3 0.6359926 -0.04054326
B.1 0.5621529 -0.26404739
B.2 0.8098687 0.07912883
B.3 0.7334650 0.38287794
C.1 0.8443924 -0.90551251
C.2 0.7922256 0.17575858
C.3 0.4923929 -0.19315789
Но подождите, говорите вы!Как насчет добавления моего столбца местоположения?Обратите внимание, что do.call(rbind,rs)
сделал с именами строк вашего результата!Мы можем добавить столбец местоположения, просто извлекая первый символ из имен строк:
result$location <- substr(row.names(result),1,1)
Это, конечно, предполагает, что ваши местоположения закодированы с использованием одного символа.Но в общем случае имена результирующих строк должны иметь форму location.x
, чтобы вы всегда могли strsplit
или регулярные выражения для извлечения имен местоположений.
Наконец, вы всегда можете просто изменить применяемую функциюк каждой части, чтобы добавить имя местоположения в виде столбца перед возвратом результата, например:
#Output not shown
myfunc1 = function(dat){
temp <- data.frame(x = runif(3), y = rnorm(3))
temp$location <- dat$location[1]
return(temp)
}
rs1 <- by(mydata,mydata$location,FUN = myfunc1)
result1 <- do.call(rbind,rs1)
Так что вам просто нужно изменить вашу функцию ECCDFpts
аналогичным образом.