我有四个简单的数据框(每个数据框对应于不同类型的农作物),每个数据框都有一列,其中包含植物生物量的值。我想合并这些数据框,以便最后得到一个包含两列的数据框:一列具有串联的植物生物量值,第二列具有一个因子值,该因子值指示其源自什么数据帧。
这是每个数据帧的前三行的复制。
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')
答案 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()