2016-10-27 6 views
0

Я относительный новичок в R и пытаюсь переделать свои данные в длинный формат из широкого формата и иметь проблемы. Я думаю, что моя проблема может быть связана с тем, что сделал data.frame из файла data.frame, который я создал в R, получив средние значения большого data.frame в другой файл data.frame.Реформирование проблем в R: моя измененная форма данных изменяет 3 переменные на 1

То, что я сделал это создал пустой data.frame (NDF):

ndf <- data.frame(matrix(ncol = 0, nrow = 3)) 

Затем используется lapply, чтобы получить средства из большого data.frame (СОЛ) в отдельные столбцы в новых данных .frame, с годом используются с большим data.frame:

ndf$Year <- names(ldf) 
ndf$col1 <- lapply(ldf, function(i) {mean(i$col1)}) 
ndf$col2 <- lapply(ldf, function(i) {mean(i$col2)}) 
etc. 

расплавленный функция reshape2 не работает, по-видимому, потому что есть неатомарная «мера» столбцы.

Для использования функции Reshape базы я использовал код:

reshape.ndf <- reshape(ndf, 
        varying = list(names(ndf)[2:7]), 
        v.names = "cover", 
        timevar = "species", 
        times = names(ndf[2:7]), 
        new.row.names = 1:1000, 
        direction = "long") 

Мой выход тогда в основном только с использованием первой строки для переменных. Так что мой широкий data.frame выглядит так (извините за странные имена):

Year Cladonia.portentosa Erica.tetralix Eriophorum.vaginatum 
1 2014    11.75    35     55  
2 2015    15.75   25.75     70  
3 2016    22.75    5     37.5 

И долго data.frame выглядит следующим образом:

Year    species cover id 
1 2014 Cladonia.portentosa 11.75 1 
2 2015 Cladonia.portentosa 11.75 2 
3 2016 Cladonia.portentosa 11.75 3 
4 2014  Erica.tetralix 35.00 1 
5 2015  Erica.tetralix 35.00 2 
6 2016  Erica.tetralix 35.00 3 

Если в колонке «крышка» должна иметь значение с каждого года, помещенного в ячейку с соответствующим годом.

Пожалуйста, кто-нибудь скажет мне, где я ошибся !?

+0

Как это можно использовать 'names (ndf [2: 7])' когда в ваших широких данных всего 4 столбца? –

+0

Вы пробовали 'tidyr :: gather()'? если нет, проверьте это. это в основном преемник reshape2. – roman

+0

42 - Я только показал часть набора данных, я пытался уменьшить путаницу, но забыл изменить код, чтобы представить то, что я показал. – dunnns

ответ

0

Вот пример «плавки» в tidyr.

Вам понадобится tidyr, но мне также нравится dplyr, и я включаю его здесь, чтобы поощрять его использование вместе с остальной частью tidyverse. Вы найдете бесконечные большие учебники по Сети ...

library(dplyr) 
library(tidyr) 

Давайте использовать ирис в качестве примера, я хочу длинную форму, где вид, переменные и значение являются столбцами.

data(iris) 

Здесь находится gather(). мы указываем, что переменная и значение являются именами столбцов для новых «расплавленных» столбцов. мы также указываем, что мы не хотим растопить столбец «Виды», который мы хотим сохранить в своем столбце.

iris_long <- iris %>% 
    gather(variable, value, -Species) 

осмотреть iris_long объект, чтобы убедиться, он работал.

+0

Спасибо @roman - Я просто попытался собрать() на моем наборе данных после вашего комментария, и он отлично сработал! Я не уверен, что я сделал неправильно, когда я это пробовал раньше, я, возможно, спешил в конце дня. – dunnns

+0

потрясающий! рад слышать это. – roman

0

В дополнение к ответу Романа, я думал, что поделился бы тем, что я сделал с моим набором данных.

Мои первоначальные «широкие» данные.кадр ndf выглядел следующим образом:

Year Cladonia.portentosa Erica.tetralix Eriophorum.vaginatum 
1 2014    11.75    35     55  
2 2015    15.75   25.75     70  
3 2016    22.75    5     37.5 

Я использовал скачано tidyr

install.packages("tidyr") 

Затем выбранный пакет

library(tidyr) 

Затем я использовал функцию gather() в tidyr пакете, чтобы собрать species колонны Cladonia.portentosaErica.tetralix и Eriophorum.vaginatum вместе в один столбец с колонкой cover в новом «длинном» кадре данных.

long.ndf <- ndf %>% gather(species, cover, Cladonia.portentosa:Eriophorum.vaginatum) 

Easy peasy! Еще раз спасибо за предложение roman!