2016-03-09 4 views
1

Моя задача - создать 5 участков (возраст против высоты) для каждого дерева, разбитых на место обитания .построение графика после функции «назначить» в R

Вот мой код:

par(mfrow = c(3,2)) 
data_x <- split(treeg,treeg$habitat) 
new_names <- c('one','two','three','four','five') 
for(i in 1:length(data_x)){ 
    assign(paste(new_names[i]),data_x[[i]]) 
} 

Здесь я расщепляется мой кадр данных "treeg" (который состоит из 5 переменных: ID, лес, среда обитания, dbh.in, height.ft, возраст) по "естественная среда". Затем я создал 5 разделенных data_frames с именами «один», «два» и т. Д.

Итак, у меня есть два вопроса: 1) Как я могу получить доступ к новым кадрам данных, которые я создал? Я имею в виду, чтобы получить доступ с целью построения графика:

for(i in 1:length(data_x)){ 
    assign(paste(new_names[i]),data_x[[i]]) 
    plot(created_dataframe$height.ft,created_dataframe$age,type = 'l') 

2) Есть ли более эффективный способ решения моей проблемы?

P.S набор данных treeg < - read.csv («http://www.ms.unimelb.edu.au/~odj/Teaching/MAST30025/data/treegrowth.csv»)

ответ

0

Если у вас есть имя переменной, хранящейся в качестве символа, вы можете использовать get(), чтобы получить содержимое переменной. Таким образом, ваш код может быть изменен на следующий, чтобы создать участки:

treeg <- read.table("Downloads/treegrowth.csv", header = TRUE, sep = ",") 
par(mfrow = c(3,2), mar = c(4.2, 4.2, 1, 1)) 
data_x <- split(treeg,treeg$habitat) 
new_names <- c('one','two','three','four','five') 

for(i in 1:length(data_x)){ 
    assign(new_names[i],data_x[[i]]) 
    created_dataframe <- get(new_names[i]) 
    plot(created_dataframe$height.ft, created_dataframe$age, type = 'l') 
} 

Я добавил параметр mar к par(), потому что поля по умолчанию довольно велики и участки оказываются очень мало. Ваше использование paste() было ненужным, и я удалил его. Используя get(), кадр данных хранится в created_dataframe и используется в приведенной ниже таблице.

Однако, это не лучший способ сделать это. На самом деле нет необходимости хранить фреймы данных под новыми именами. Гораздо удобнее просто хранить фреймы данных в списке (data_x), потому что это позволяет вам получить к ним доступ по индексу, и вам не нужны ни assign(), ни get(). Так что это будет также производить сюжет:

treeg <- read.table("Downloads/treegrowth.csv", header = TRUE, sep = ",") 
par(mfrow = c(3,2), mar = c(4.2, 4.2, 1, 1)) 
data_x <- split(treeg,treeg$habitat) 

for(i in 1:length(data_x)){ 
    plot(data_x[[i]]$height.ft, data_x[[i]]$age, type = 'l') 
} 

Если вы хотите, вы также можете заменить for -loop на lapply():

lapply(data_x, function(x) plot(x$height.ft, x$age, type = 'l')) 

Это сюжет:

enter image description here

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