2015-11-14 5 views
0

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

Например, у меня есть данные из нескольких лет, несколько графиков и несколько выборок внутри этих графиков и параметр в конце (x, y). Таким образом, мои заголовки данных выглядит следующим образом:

год, земля, образец ID

У меня есть много уровней внутри каждого из них, и я хочу, чтобы иметь возможность быстро и легко построить эти значения, например, в год = 2015, plot = 3 и Sample ID = C.

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

plot(x[Year=="2015" & Plot=="3" & Sample ID=="C"], 
     y[Year=="2015" & Plot=="3" & Sample ID=="C"] 
) 
+0

Во-первых, получить данные вместе, используя 'merge' , так что у вас есть один фрейм данных с x и y, а не отдельные кадры для каждого. Если вы используете базовые сюжеты, 'with' является вашим другом. 'subset()' также может сэкономить массу текста (хотя 'dplyr' лучше). Но вы можете сделать это с помощью (подмножество (данные, год == "2015", график == "3", SampleID == "C"), plot (x, y)) '. – Gregor

+0

Спасибо, Грегор, я забыл упомянуть, что я первоначально был настройкой данных, это потребовало от меня написать тонну кода (поскольку петли кажутся свисающей морковкой, которую я никогда не смогу достичь). Это также сделало так много прикрепленных объектов, что это заставило меня почувствовать себя загроможденным. Возможно, захламленный все еще есть путь. – Dilliplaine33

+0

Никогда не присоединяйся, это неприятная привычка. Вы просто хотите выписать кучу сюжетов (скажем, все комбинации) в файлы? Ваш вопрос заставил вас казаться, что вы хотите делать что-то в интерактивном режиме, но вы просто хотите, чтобы сценарий начинал рисовать за каждый год, каждый сюжет, каждый образец, это совсем другой вопрос. – Gregor

ответ

0

Итак, допустим, что ваши данные выглядит следующим образом:

base_data = expand.grid(Year = 2013:2015, 
         Plot = 1:3, 
         SampleID = LETTERS[1:3], 
         ObsID = 1:4) 
n = nrow(base_data) 
base_data$x = runif(n) 
base_data$y = rnorm(n) 
head(base_data) 
# Year Plot SampleID ObsID   x   y 
# 1 2013 1  A  1 0.5504904 0.64624816 
# 2 2014 1  A  1 0.5337804 0.08473398 
# 3 2015 1  A  1 0.9584508 0.31683347 
# 4 2013 2  A  1 0.0854122 0.61898020 
# 5 2014 2  A  1 0.8061409 -0.46255868 
# 6 2015 2  A  1 0.8764612 0.24384120 

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

Во всяком случае, для построения y в сравнении с x для каждого года, графика и образца. Мне нравится использовать dplyr для этого:

library(dplyr) 
# first we group our data 
group_by(base_data, Year, Plot, SampleID) %>% 
    # then we "do" a function that saves a plot 
    # within this function, `.` is an abbreviation for 
    # the piece of the data frame that is one group 
    do({ 
     # create a filename. Within a group, there is only 
     #  one value each for year, plot, and sample ID 
     #  so I'll just use the first row in the filename 
     group_name = paste0("y", .[1, "Year"], 
          "-p", .[1, "Plot"], 
          "-s", .[1, "SampleID"]) 
     # initialize the file 
     png(filename = paste0(group_name, ".png")) 
     # draw the plot 
     plot(.[["x"]], .[["y"]]) 
     # close the file 
     dev.off() 
     # dplyr will be happy if we return a data frame 
     return(.) 
    }) 

Это должно создать сюжет, сохраненный в рабочем каталоге для каждой комбинации года, участок, и образец ID. Я заметил, код очень тщательно, но я буду повторять это снова ниже, без комментариев, чтобы подчеркнуть, что это на самом деле очень краткий набор команд:

group_by(base_data, Year, Plot, SampleID) %>% 
    do({ 
     group_name = paste0("y", .[1, "Year"], 
          "-p", .[1, "Plot"], 
          "-s", .[1, "SampleID"]) 
     png(filename = paste0(group_name, ".png")) 
     plot(.[["x"]], .[["y"]]) 
     dev.off() 
     return(.) 
    }) 
+0

Это ответ на вопрос прямо и полезно. Также были даны рекомендации по использованию> dput() для более удобных вопросов. – Dilliplaine33

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