2015-04-04 5 views
-1

Итак, у меня есть большой набор данных с большим количеством столбцов (10) и 100 000 строк. Одна из столбцов - дата наблюдения с двумя другими соответствующими столбцами, одним видом и другим годом. Во-первых, я хочу создать новый столбец, который даст мне среднюю дату наблюдения для каждого вида за каждый год для первых 10% наблюдений (для каждого вида за каждый год). Во-вторых, я хочу уменьшить этот набор данных, чтобы остались только строки, участвующие в вычислении (т. Е. Первые 10%). Наконец, важно, чтобы мой новый набор данных имел другие соответствующие столбцы с информацией для каждого наблюдения, т. Е. Ect места. Образец набора данных (там существуют дополнительные столбцы):R: Уменьшение набора данных и создание условного среднего

date=c(3,84,98,100,34,76,86...) 
species=c(blue,purple,grey,purple,green,pink,pink,white...) 
id=c(1,2,3,2,4,5,5,6...) 
year=c(1901,2000,1901,1996,1901,2000,1986...) 
habitat=c(forest,plain,mountain...) 

Ex: первая строка говорит вид синий был замечен на 3 января 1901 года в лесу.

+1

data.table и dplyr являются хорошими пакетами для такого рода манипуляций. Также см. Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

Я действительно ужасен с R, любая идея, как я буду использовать dplyr специально? – John

ответ

0

Хорошо, вот один подход с использованием dplyr. Это даст вам значение переменной по видам и годам, используя первые 10% наблюдений для каждой группы.

require(dplyr) 

# test data set 
test <- data.frame(species = c(rep("blue", 100), rep("purple",100)), 
        year = rep(c(1901, 1902, 1903, 1904, 1905), 40), 
        value = rnorm(200), 
        stringsAsFactors = FALSE) 

# checking data set 
group_by(test, species, year) %>% summarise(n = n(), mean.value = mean(value)) 

# by species and year, identify first ten per cent of observations 
test <- test %>% group_by(species, year) %>% 
    mutate(nth.ob = seq_along(species), n.obs = n(), pc = round((nth.ob/n.obs*100), 2)) %>% 
    arrange(species, year) # sort for easy viewing 

# and check 
head(test) 
Source: local data frame [6 x 6] 
Groups: species, year 

    species year  value nth.ob n.obs pc 
1 blue 1901 -0.2839094  1 20 5 
2 blue 1901 -1.7158035  2 20 10 
3 blue 1901 1.1664650  3 20 15 
4 blue 1901 -0.0935940  4 20 20 
5 blue 1901 -0.1199253  5 20 25 
6 blue 1901 0.3461677  6 20 30 

# reduce to top 10 %, summarise and drop unwanted variables 
out <- test %>% 
    filter(pc <= 10) %>% # select first 10% of observations by species and year 
    summarise(mean_val = mean(value)) 
out 


Source: local data frame [10 x 3] 
Groups: species 

    species year mean_val 
1  blue 1901 -0.99985643 
2  blue 1902 0.08355729 
3  blue 1903 0.67396796 
4  blue 1904 0.14425229 
5  blue 1905 -0.19426698 
6 purple 1901 0.95767665 
7 purple 1902 -0.40730494 
8 purple 1903 0.10032964 
9 purple 1904 0.36295224 
10 purple 1905 1.30953008 

Если затем вы хотите настройки, в котором было обнаружено первое наблюдение, я считаю, что лучший способ сделать это было бы сделать что-то вроде

setting <- group_by(species, year) %>% 
    filter(row_number() == 1) 

, а затем присоединиться данными в out набор данных

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