2016-02-15 3 views
2

У меня есть data.frame с различными данными года для набора наблюдений. Название столбцов - год, и год повторения идентифицируется по году, за которым следует ".1" (2008 и 2008.1 повторный год).Средние столбцы кадра данных

dput() не для первого наблюдения data.frame заключается в следующем:

structure(list(ID = 2174L, `1992` = 0L, `1993` = 0L, `1994` = 0L, 
    `1994.1` = 0L, `1995` = 0L, `1996` = 0L, `1997` = 0L, `1998` = 0L, 
    `1999` = 0L, `1997.1` = 0L, `1998.1` = 0L, `1999.1` = 0L, 
    `2000` = 0L, `2001` = 0L, `2002` = 0L, `2003` = 0L, `2000.1` = 0L, 
    `2001.1` = 0L, `2002.1` = 0L, `2003.1` = 0L, `2004` = 0L, 
    `2005` = 0L, `2006` = 0L, `2007` = 0L, `2008` = 0L, `2004.1` = 0L, 
    `2005.1` = 0L, `2006.1` = 0L, `2007.1` = 0L, `2008.1` = 0L, 
    `2009` = 0L, `2010` = 0L, `2011` = 0L, `2012` = 0L, `2013` = 0L, 
    altura_mean_30arc = 341, dist_p = -1239.46778549383, dist_capital = 310537.289055982, 
    municode = 428, slope = 0.109233340937795, dist_f = -54589.0213329769), .Names = c("ID", 
"1992", "1993", "1994", "1994.1", "1995", "1996", "1997", "1998", 
"1999", "1997.1", "1998.1", "1999.1", "2000", "2001", "2002", 
"2003", "2000.1", "2001.1", "2002.1", "2003.1", "2004", "2005", 
"2006", "2007", "2008", "2004.1", "2005.1", "2006.1", "2007.1", 
"2008.1", "2009", "2010", "2011", "2012", "2013", "altura_mean_30arc", 
"dist_p", "dist_capital", "municode", "slope", "dist_f"), row.names = 2174L, class = "data.frame") 

Я хочу, чтобы вычислить среднее значение года и повторный год (2008 и 2008.1). Чтобы упростить процесс, который я попробовал цикл для каждого неоднократного года:

duplicated_years <- c("1994", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008") 
duplicated_years2 <- str_c(duplicated_years, "1", sep = ".") 
for(i in as.numeric(duplicated_years)){ 
    for(j in as.numeric(duplicated_years2)){ 
    df[, str_c(i, "mean", sep="_")] <- ((df$i + df$j)/2) 
    } 
} 

Но результат представляет собой набор новых переменных с НС. Я знаю, что вместо этого могу использовать rowMean(), но индексирование для меня довольно сложно.

+0

Вы хотите этого также с помощью ID? –

+0

Да, это идея. Вот почему я думаю в опции 'rowMeans' –

+0

Помогло ли вам это? Если нет, я удалю. –

ответ

3

Когда вы работаете с широким форматом и имеете много столбцов для работы по строке, лучше (в R) преобразовать в длинный формат и вместо этого работать с одним столбцом. Тогда преобразование обратно в широкой форме (в случае необходимости) является довольно прямо вперед

Например, вот способ найти все столбцы, содержащие год

colindex <- grep("\\d{4}", names(df)) 

Затем, используя data.table мы можем выбрать те из них (с ID тоже), melt его в длинный формат, рассчитать средства на пользователя в год, при переходе обратно в широкий формат.

library(data.table) 
dcast(melt(setDT(df)[, c(1L, colindex), with = FALSE], id = 1L), 
     ID ~ sub("\\..*", "", variable), value.var = "value", mean) 
#  ID 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 
# 1: 2174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+0

Вам не нужно преобразовывать 'df' в data.table. Хотя, когда нет, 'sub (" \\ .. * "," ", variable)' дает ошибку синтаксического анализа, но использует 'sub (" \\. \\ d "," ", variable)' вместо этого не ... должно быть ошибка? – Cath

+1

@Cath Welp, вы делаете. Если вы изучите исходный код 'data.table :: melt', вы заметите, что он вызывает' reshape2 :: melt' для 'data.frame'. Это, вероятно, также объяснит ошибку, которая исходит из 'reshape2', а не из' data.table' –

+0

ok Прошу прощения, мне нужно спросить: это не даст такой же результат? – Cath

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