Проходить и отображать столбцы двух одинаковых фреймов данных - PullRequest
0 голосов
/ 28 мая 2018

У меня есть два кадра данных, которые я хотел бы построить друг против друга:

> df1 <- data.frame(HV = c(3,3,3), NAtlantic850t = c(0.501, 1.373, 1.88), AO = c(-0.0512, 0.2892, 0.0664))

> df2 <- data.frame(HV = c(3,3,2), NAtlantic850t = c(1.2384, 1.3637, -0.0332), AO = c(-0.5915, -0.0596, -0.8842))

Они идентичны, я хотел бы построить их столбец против столбца (например, df1 $ HV, df2 $ HV) - переберите столбцы данных и поместите их друг на друга в диаграмме рассеяния.

Я просмотрел более 20 вопросов, задающих похожие вещи, и не могу понять - был бы признателен за помощь в том, с чего начать.Могу ли я использовать lapply и plot или ggplot, когда они - два DF?Должен ли я объединить их в первую очередь?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вот один из способов сделать это - перебрать индексы столбцов и создать графики один за другим, добавив их в список и записав каждый в файл:

library(ggplot2)

# create some data to plot 
df1 <- iris[, sapply(iris, is.numeric)]
df2 <- iris[sample(1:nrow(iris)), sapply(iris, is.numeric)]

# a list to catch each plot object 
plot_list <- vector(mode="list", length=ncol(df1))

for (idx in seq_along(df1)){

  plot_list[[idx]] <- ggplot2::qplot(df1[[idx]], df2[[idx]]) + 
    labs(title=names(df1)[idx])

  ggsave(filename=paste0(names(df1)[idx], ".pdf"), plot=plot_list[[idx]])
}

Как вы предлагаете ввопрос, вы также можете использовать s/lapply() с анонимной функцией, например, вот так (хотя здесь мы не храним графики, просто записываем каждый на диск):

lapply(seq_along(df1), function(idx){
  the_plot <- ggplot2::qplot(df1[[id]], df2[[idx]]) + labs(title=names(df1)[idx])
  ggsave(filename=paste0(names(df1)[idx], ".pdf"), plot=the_plot)
})

Если вы хотите сохранитьсписок графиков (как в примере for -loop), просто присвойте lapply() переменной (например, plot_list) и добавьте строку наподобие return(the_plot) перед закрытием функции.

Естьтонны способов, которыми вы могли бы изменить / адаптировать этот подход, в зависимости от ваших целей.

Надеюсь, это поможет ~~

ps если возможно, столбцы будут не в том же порядке, лучше перебрать столбец names вместо индексов столбцов (т.е. используйте for (colname in names(df1)){... вместо for (idx in seq_along(df1)){...).Вы можете использовать один и тот же синтаксис подмножества [[ с именами и индексами.

0 голосов
/ 28 мая 2018

Вы можете циклически проходить по столбцам следующим образом:

for(col in 1:ncol(df1)){
  plot(df1[,col], df2[,col])
}

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

0 голосов
/ 28 мая 2018

Как вы предлагаете, я бы действительно перед тем, как вызвать команду plot, сначала переставил бы в список фреймов данных для печати.Я думаю, что это было бы особенно кстати, если вы хотите передать аргумент data в ggplot.Что-то вроде:

plot_dfs <- lapply(names(df1),function(nm)data.frame(col1 = df1[,nm], col2 = df2[,nm]))
for (df in plot_dfs)plot(x = df[,"col1"], y = df[,"col2"])

или с использованием ggplot:

for (df in plot_dfs){
  print(
  ggplot(data = df, aes(x=col1, y=col2)) +
  geom_point())}

, и если вы хотите добавить имена столбцов в качестве заголовков графиков, вы можете сделать:

for (idx in seq_along(plot_dfs)){
  print(
    ggplot(data = plot_dfs[[idx]], aes(x=col1, y=col2)) +
      ggtitle(names(df1)[idx]) +
      geom_point())}
...