2013-02-21 1 views
4

Я хотел бы усреднить столбцы в кадре данных в R, который содержит целочисленные значения, а иногда и NA.Средние столбцы в dataframe в R

Информационная рамка под названием CD6 (Климатический отдел 6), которая инициализируется значениями NA для хранения средних значений для всех данных, относящихся к климатическому отделу 6. Строки представляют собой даты, а столбцы представляют часы от 0 до 23. Экран данных как это:

> CD6 

     Date  H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23 
     1948-07-01 NA NA NA NA NA NA NA NA NA NA NA ... NA 
     1948-07-02 NA NA NA NA NA NA NA NA NA NA NA ... NA 
     1948-07-03 NA NA NA NA NA NA NA NA NA NA NA ... NA 

dataframe называется CA имеет истинные значения для всех климатических подразделений в пределах от 1 до 7. кадр данных выглядит следующим образом:

> CA 

     Climate_Division Date  H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23 
     6     1948-07-01 NA NA NA NA NA NA NA NA NA NA NA ... NA 
     5     1948-07-01 0 1 1 3 0 0 0 0 0 0 0 ... 2 
     6     1948-07-01 0 1 1 3 0 0 0 0 0 0 0 ... 2 
     6     1948-07-01 1 0 0 5 7 0 1 1 1 0 0 ... 0 
     6     1948-07-02 0 2 1 2 1 1 NA 0 1 0 1 ... 2 
     6     1948-07-03 NA NA NA NA NA NA NA NA NA NA NA ... NA 

у меня есть цикл кодированный, что будет выполнять итерацию через datafram e ЦС по строкам и сопоставить с правильным фреймворком данных для климатического деления (в этом примере CD6 для климатического деления 6). Проблема в том, что я не знаю, сколько строк есть для каждого климатического деления, чтобы в среднем принять его.

Если посмотреть только на CD6, я бы хотел получить среднее значение для каждой даты в определенный час, который игнорирует NA, если присутствуют истинные значения, а окончательный ответ - целое число (потолок значения). Если все часы в различных климатических деления имеют значение NA, я хотел бы сохранить его в качестве так как противостоять 0. Конечный результат должен выглядеть следующим образом для CD6

> CD6 

     Date  H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23 
     1948-07-01 1 1 1 4 4 0 1 1 1 0 0 ... 1 
     1948-07-02 0 2 1 2 1 1 NA 0 1 0 1 ... 2 
     1948-07-03 NA NA NA NA NA NA NA NA NA NA NA ... NA 

Я не знаю точно как это сделать при кодировании и использовании этого опыта. Поэтому любые предложения будут полезны и благодарны за ваше время.

+0

Вы можете вставить выходные данные 'dput (CA)' здесь, чтобы мы могли воспроизвести ваши данные? –

+0

как среднее значение 1 и 0 (для Climate_Division = 6 и Date = 1948-07-01) 1? Разве это не должно быть 0,5? –

+0

geektrader - вы правы, он должен быть 0,5, однако я положил 1, поскольку я взял его, чтобы поддерживать целые числа. –

ответ

2

Что вы ищете агрегатных средств путем группировки по двум колонкам CA т.е. Climate_Division и Date. Для этого вы можете использовать встроенную функцию aggregate.

> t <- 'Climate_Division Date  H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 
+ 6     1948-07-01 NA NA NA NA NA NA NA NA NA NA NA 
+ 5     1948-07-01 0 1 1 3 0 0 0 0 0 0 0 
+ 6     1948-07-01 0 1 1 3 0 0 0 0 0 0 0 
+ 6     1948-07-01 1 0 0 5 7 0 1 1 1 0 0 
+ 6     1948-07-02 0 2 1 2 1 1 NA 0 1 0 1 
+ 6     1948-07-03 NA NA NA NA NA NA NA NA NA NA NA' 
> 
> CA <- read.table(textConnection(t), header=T) 
> 
> CA 
    Climate_Division  Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 
1    6 1948-07-01 NA NA NA NA NA NA NA NA NA NA NA 
2    5 1948-07-01 0 1 1 3 0 0 0 0 0 0 0 
3    6 1948-07-01 0 1 1 3 0 0 0 0 0 0 0 
4    6 1948-07-01 1 0 0 5 7 0 1 1 1 0 0 
5    6 1948-07-02 0 2 1 2 1 1 NA 0 1 0 1 
6    6 1948-07-03 NA NA NA NA NA NA NA NA NA NA NA 
> #Now that we have our data, we do aggregation of data and calculate mean over that using following command 
> CAMeans <- aggregate(CA[,3:13], by =list(CA[,1], CA[,2]), FUN = mean, na.rm = TRUE) 
> 
> CAMeans 
    Group.1 Group.2 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 
1  5 1948-07-01 0.0 1.0 1.0 3 0.0 0 0.0 0.0 0.0 0 0 
2  6 1948-07-01 0.5 0.5 0.5 4 3.5 0 0.5 0.5 0.5 0 0 
3  6 1948-07-02 0.0 2.0 1.0 2 1.0 1 NaN 0.0 1.0 0 1 
4  6 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
> 
> #Need to change the names of grouping column back to what they were before 
> names(CAMeans)[1:2] <- c('Climate_Division', 'Date') 
> 
> CAMeans 
    Climate_Division  Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 
1    5 1948-07-01 0.0 1.0 1.0 3 0.0 0 0.0 0.0 0.0 0 0 
2    6 1948-07-01 0.5 0.5 0.5 4 3.5 0 0.5 0.5 0.5 0 0 
3    6 1948-07-02 0.0 2.0 1.0 2 1.0 1 NaN 0.0 1.0 0 1 
4    6 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
> 
> #Now you can subset CAMeans to get content for CD6 
> CD6 <- CAMeans[CAMeans$Climate_Division == 6, 2:ncol(CAMeans)] 
> 
> CD6 
     Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 
2 1948-07-01 0.5 0.5 0.5 4 3.5 0 0.5 0.5 0.5 0 0 
3 1948-07-02 0.0 2.0 1.0 2 1.0 1 NaN 0.0 1.0 0 1 
4 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
+1

Я смирен. Хотя в моей защите вопрос был немного неясным. – N8TRO

+0

geektrader - Спасибо за помощь. Я не понимал, что агрегат функции может сделать это хорошо для меня. Натан - извините за замешательство, я изо всех сил старался объяснить сложный круглый способ выполнения этого, но я, видимо, не очень хорошо себя чувствовал. Тем не менее, спасибо за вашу помощь. –

1

Угадайте, что вы хотите здесь, поэтому я дал 2 варианта: rowMeans() и colMeans().

CA <- read.table(
header=TRUE, text='Climate_Division Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H23 
6 1948-07-01 NA NA NA NA NA NA NA NA NA NA NA NA 
5 1948-07-01 0 1 1 3 0 0 0 0 0 0 0 2 
6 1948-07-01 0 1 1 3 0 0 0 0 0 0 0 2 
6 1948-07-01 1 0 0 5 7 0 1 1 1 0 0 0 
6 1948-07-02 0 2 1 2 1 1 NA 0 1 0 1 2 
6 1948-07-03 NA NA NA NA NA NA NA NA NA NA NA NA') 

CD6 <- data[CA$Climate_Division==6, ] # Populating your data does not require a loop. 

(CD6rmeans <- rowMeans(CD6[, -2], na.rm=TRUE)) 

#  1  3  4  5  6 
# 6.000 1.000 1.692 1.417 6.000 
t(CD6cmeans <- colMeans(CD6[ ,-2], na.rm=TRUE)) 

# Climate_Division  H0 H1  H2 H3 H4  H5 H6  H7  H8 H9 H10 H23 
# [1,]   6 0.3333 1 0.6667 3.333 2.667 0.3333 0.5 0.3333 0.6667 0 0.3333 1.333