Вертикально объединить столбцы из разных фреймов данных и добавить новый столбец со значением, соответствующим фрейму данных, полученному из - PullRequest
0 голосов
/ 03 июля 2018

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

Вот репликация первых трех строк каждого из фреймов данных.

id <- seq(1:3)
fallow_ndvi <- c(0.1547380, 0.2494604, 0.2277472)
fallow_df <- data.frame(id, fallow_ndvi)

wheat_ndvi <- c(0.5137470, 0.1146732, 0.5774466)
wheat_df <- data.frame(id, wheat_ndvi)

date_ndvi <- c(0.1547380, 0.2494604, 0.2277472)
date_df <- data.frame(id, date_ndvi)

lettuce_ndvi <- c(0.5036867, 0.4597749, 0.5764071)
lettuce_df <- data.frame(id, lettuce_ndvi)

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

Ожидаемый результат:

expected_output <-c(fallow_ndvi, wheat_ndvi, date_ndvi, lettuce_ndvi)
expected_output_df <- data.frame(expected_output)

fallow_vector <- rep('fallow_ndvi', each = 3)
wheat_vector <- rep('wheat_ndvi', each = 3)
date_vector <- rep('date_ndvi', each = 3)
lettuce_vector <- rep('lettuce_ndvi', each = 3)

originating_df_vector <- c(fallow_vector, wheat_vector, date_vector, lettuce_vector)


expected_output_df[ ,'field_category'] <- originating_df_vector

names(expected_output_df) <- c('NDVI', 'field_type')

enter image description here

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Использование tidyverse

library(tidyverse)
l <- list(fallow_df, wheat_df, date_df, lettuce_df) # or mget(ls(pattern = "_df")) if necessary
map(l,select,-id) %>% bind_cols %>% gather(field_type,NDVI)
#      field_type      NDVI
# 1   fallow_ndvi 0.1547380
# 2   fallow_ndvi 0.2494604
# 3   fallow_ndvi 0.2277472
# 4    wheat_ndvi 0.5137470
# 5    wheat_ndvi 0.1146732
# 6    wheat_ndvi 0.5774466
# 7     date_ndvi 0.1547380
# 8     date_ndvi 0.2494604
# 9     date_ndvi 0.2277472
# 10 lettuce_ndvi 0.5036867
# 11 lettuce_ndvi 0.4597749
# 12 lettuce_ndvi 0.5764071
0 голосов
/ 03 июля 2018

Вы можете использовать dplyr::bind_rows() или даже rbind() в Base R. Вы можете указать имя фрейма данных в самих фреймах данных или использовать аргумент .id в dplyr::bind_rows() и автоматически генерировать его для Вы, хотя это не будет так явно, как если бы вы предоставили это сами.

library(dplyr)
id <- seq(1:3)
fallow_ndvi <- c(0.1547380, 0.2494604, 0.2277472)
fallow_df <- data.frame(id, df = "fallow", ndvi = fallow_ndvi, stringsAsFactors = FALSE)

wheat_ndvi <- c(0.5137470, 0.1146732, 0.5774466)
wheat_df <- data.frame(id, df = "wheat", ndvi = wheat_ndvi, stringsAsFactors = FALSE)

date_ndvi <- c(0.1547380, 0.2494604, 0.2277472)
date_df <- data.frame(id, df = "date", ndvi = date_ndvi, stringsAsFactors = FALSE)

lettuce_ndvi <- c(0.5036867, 0.4597749, 0.5764071)
lettuce_df <- data.frame(id, df = "lettuce", ndvi = lettuce_ndvi, stringsAsFactors = FALSE)

combined_df <- dplyr::bind_rows(fallow_df
                                , wheat_df
                                , date_df
                                , lettuce_df)
combined_df
# id      df      ndvi
# 1   fallow 0.1547380
# 1   fallow 0.2494604
# 1   fallow 0.2277472
# 2    wheat 0.5137470
# 2    wheat 0.1146732
# 2    wheat 0.5774466
# 3     date 0.1547380
# 3     date 0.2494604
# 3     date 0.2277472
# 4  lettuce 0.5036867
# 4  lettuce 0.4597749
# 4  lettuce 0.5764071
0 голосов
/ 03 июля 2018

Мы можем использовать tidyverse

library(tidyverse)
mget(ls(pattern = "_df")) %>% 
      map_df(~ .x %>% 
                  select(matches("ndvi")) %>% 
                  mutate(field_type = names(.)) %>% 
                  select(NDVI = 1, field_type))
#      NDVI   field_type
#1  0.1547380    date_ndvi
#2  0.2494604    date_ndvi
#3  0.2277472    date_ndvi
#4  0.1547380  fallow_ndvi
#5  0.2494604  fallow_ndvi
#6  0.2277472  fallow_ndvi
#7  0.5036867 lettuce_ndvi
#8  0.4597749 lettuce_ndvi
#9  0.5764071 lettuce_ndvi
#10 0.5137470   wheat_ndvi
#11 0.1146732   wheat_ndvi
#12 0.5774466   wheat_ndvi
0 голосов
/ 03 июля 2018
 stack(Reduce(merge,mget(ls(pattern = "_df")))[-1])
      values          ind
1  0.1547380    date_ndvi
2  0.2494604    date_ndvi
3  0.2277472    date_ndvi
4  0.1547380  fallow_ndvi
5  0.2494604  fallow_ndvi
6  0.2277472  fallow_ndvi
7  0.5036867 lettuce_ndvi
8  0.4597749 lettuce_ndvi
9  0.5764071 lettuce_ndvi
10 0.5137470   wheat_ndvi
11 0.1146732   wheat_ndvi
12 0.5774466   wheat_ndvi

Так как вы сказали, id не важно, мы можем отбросить его:

stack(lapply(mget(ls(pattern = "_df")),"[[",2))
      values        ind
1  0.1547380    date_df
2  0.2494604    date_df
3  0.2277472    date_df
4  0.1547380  fallow_df
5  0.2494604  fallow_df
6  0.2277472  fallow_df
7  0.5036867 lettuce_df
8  0.4597749 lettuce_df
9  0.5764071 lettuce_df
10 0.5137470   wheat_df
11 0.1146732   wheat_df
12 0.5774466   wheat_df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...