垂直合并来自不同数据帧的列,并添加新列,该列的值对应于源自

时间:2018-07-02 22:16:30

标签: r

我有四个简单的数据框(每个数据框对应于不同类型的农作物),每个数据框都有一列,其中包含植物生物量的值。我想合并这些数据框,以便最后得到一个包含两列的数据框:一列具有串联的植物生物量值,第二列具有一个因子值,该因子值指示其源自什么数据帧。

这是每个数据帧的前三行的复制。

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)

我应该注意,每个数据框具有不同的行数,并且ID值无关紧要(尽管它们出现在数据集中,因为它们是在我的工作流程中自动生成的。

预期输出:

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 :(得分:2)

使用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

答案 1 :(得分:1)

我们可以使用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

答案 2 :(得分:0)

 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

答案 3 :(得分:0)

您可以在Base R中使用dplyr::bind_rows()甚至是rbind()。您可以在数据帧本身中指定数据帧名称,也可以在{{1}中使用.id参数},并让它自动为您生成它,尽管它不会像您自己提供一样明确。

dplyr::bind_rows()