2013-09-25 3 views
0

Что, наконец, работал был:Loop на каждом уровне фактора

 a <- cast(we, year ~ region, mean, value='response') 

Хотя, у меня только 1 наблюдение каждого региона и места, так значит, это просто обходной путь. Я не мог заставить c работать как функция.

  • Выход для предложенного ответа (Джастин)

    > DT 
        > response year 
        > 1:  15 2000 
        > 2:  6 2000 
        > 3:  23 2000 
        > 4:  23 2000 
        ---    
        > 794:  3 2010 
        > 795:  5 2010 
        > 796:  1 2010 
    
  • Update: желаемый результат должен выглядеть следующим образом:

    > Year x1 x2 x3 x4 
        > 2000 4 5 16 22 
        > 2001 6 11 2 18 
        > 2002 1 0 21 10 
        > ... 
    

Я изо всех сил, чтобы найти способ, чтобы транспонировать мои данные основаны на факторах. У меня есть данные с 2 столбцами, фактором и ответом. У меня много строк для каждого коэффициента, поэтому я хочу переставить таблицу таким образом, чтобы каждый фактор находился в одной строке, причем разные ответы были как столбцы в этой строке. Я не могу показаться подмножеством в цикле, основанном на уровнях этого фактора. Буду признателен за понимание.

пример данных:

  > response year 
      > 5   2001 
      > 10   2001 
      > 8   2001 
      > 1   2002 
      > 7   2010 

    > levels(data$year) 
    [1] "2000" "2001" "2002" "2003" "2004" "2005" ... 
    w <- matrix(0,54,15) 

    for(i in 1:levels(data$year)){ 
    w[i] <- levels(data$year)==i 
    } 

Этот синтаксис явно не правильно, но это идея о том, что я пытаюсь сделать.

спасибо.

+0

Можете ли вы включить свой желаемый выход. Я не совсем понимаю, что вы пытаетесь сделать. – Justin

+0

Да, мне нужна строка за каждый год (уровень фактора) с ответами в этой строке: я приведу пример выше. –

+0

Это все еще неясно, хотя у вас есть пример, потому что нет никакого способа узнать, что входит в какой столбец. Что такое x1, x2 и т. Д.? В строке, являются ли дополнительные столбцы фактическим ответом, а записи - значениями ответов в этой ячейке? Или, столбцы x1 и т. Д. Дополнительный фактор, кроме года, и ответы - это всего лишь фактический ответ. – John

ответ

1

Использование data.table пакета это тривиально:

library(data.table) 
DT <- data.table(data) 
DT[, as.list(value), by=year] 

Однако это развалится, если у вас есть разное количество наблюдений в год. Вместо этого:

DT[, list(values = list(value)), by=year] 

Или с помощью базового R:

tapply(data$value, data$year, c) 
+0

Это, похоже, сработало, но это не дает мне сводную таблицу данных, которая, по-видимому, дает мне разбиение строк в год, а не столбцы со значениями по годам в одной строке. Может, мне не хватает шага?Я опубликую выше. –

+0

Первая версия даст вам столбцы. Но этот план может работать, только если у вас одинаковое количество образцов в год. В противном случае список, подобный версии, возвращенной с 'tapply', будет намного лучшим вариантом. – Justin

+0

В качестве альтернативы 'tapply' вы также можете использовать' with (data, split (value, year)) ' –

1

Вот еще один способ, с помощью aggregate:

> set.seed(1) 
> data <- data.frame(year = rep(2000:2010, each=10), value = sample(3:30, 110, TRUE)) 
> aggregate(value~year, data=data, FUN=c) 
    year value.1 value.2 value.3 value.4 value.5 value.6 value.7 value.8 value.9 value.10 
1 2000  10  13  19  28  8  28  29  21  20  4 
2 2001  8  7  22  13  24  16  23  30  13  24 
3 2002  29  8  21  6  10  13  3  13  27  12 
4 2003  16  19  16  8  26  21  25  6  23  14 
5 2004  25  21  24  18  17  25  3  16  23  22 
6 2005  16  27  15  9  4  5  11  17  21  14 
7 2006  28  11  15  12  21  10  16  24  5  27 
8 2007  12  26  12  12  16  27  27  13  24  29 
9 2008  15  22  14  12  24  8  22  6  9  7 
10 2009  9  4  20  27  24  25  15  14  25  19 
11 2010  21  12  10  30  20  8  6  16  28  19 
+0

Похоже, это может быть то, о чем просят. – John

+0

Это похоже на то, что мне нужно, но по какой-то причине я получаю следующую ошибку: Ошибка в get (as.character (FUN), mode = "function", envir = envir): объект 'FUN' of mode ' function 'не найден –

+0

Вы получаете эту ошибку, потому что (возможно) у вас есть объект с именем 'c' в вашей среде, поэтому вы перезаписали функцию' c', и именно поэтому появляется ошибка. Существует два решения: 1) удалить объект 'c', который у вас есть в сеансе или 2) предоставить среду, в которой содержится функция' c': 'aggregate (value ~ year, data = data, FUN = base :: c) 'Я предпочитаю последний: D –

0

Если бы я имел разное количество ответов в год, я бы, вероятно, придет по этой проблеме, сначала создав новую переменную для представления ответа в каждом году, а затем выставив этот набор данных с помощью dcast. По умолчанию dcast заполняет отсутствующие значения с помощью NA, хотя вы можете изменить это, если необходимо.

set.seed(1) 
data = data.frame(year = c(rep(2000:2010, each=10), 2011), value = sample(3:30, 111, TRUE)) 

require(reshape2) 
require(plyr) 
# Create a new variable representing the number of responses per year and add to dataset 
dat2 = ddply(data, .(year), transform, 
       response = interaction("x", 1:length(value), sep = "")) 

dcast(dat2, year ~ response, value.var = "value") 
+0

Я думаю, что переменное количество ответов в год является проблемой для этого. –

+0

Мой пример имеет переменное количество ответов в год. Вот почему я это сказал. Я мог видеть проблему, если у вас есть, скажем, ответы 1-4 за один год и ответы 2-5 в другой год. Я не знаю, как вы с этим справитесь. – aosmith

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