2017-01-13 2 views
1

У меня около 50 data.frames. Они являются результатом различных имитацийdplyr :: bind_cols (удалить первый столбец при объединении нескольких data.frames)

Примеры data.frames ниже

SiteID <- c("Site1", "Site2", "Site3", "Site4", "Site5") 
measured_s1 <- c(21:25) 
simulated_s1 <- c(22:26) 
df <- data.frame(SiteID, measured_s1, simulated_s1) 

SiteID <- c("Site1", "Site2", "Site3", "Site4", "Site5") 
measured_s2 <- c(21:25) 
simulated_s2 <- c(21.5:25.5) 
df_s2 <- data.frame(SiteID, measured_s2, simulated_s2) 

SiteID <- c("Site1", "Site2", "Site3", "Site4", "Site5") 
measured_s3 <- c(21:25) 
simulated_s3 <- c(21.2:25.2) 
df_s3 <- data.frame(SiteID, measured_s3, simulated_s3) 

Я хочу, чтобы объединить все из них. Я сделал это с помощью bind_cols

dplyr::bind_cols(df, df_s2, df_s3) 
     SiteID measured_s1 simulated_s1 SiteID measured_s2 simulated_s2 SiteID measured_s3 simulated_s3 
    #1 Site1   21   22 Site1   21   21.5 Site1   21   21.2 
    #2 Site2   22   23 Site2   22   22.5 Site2   22   22.2 
    #3 Site3   23   24 Site3   23   23.5 Site3   23   23.2 
    #4 Site4   24   25 Site4   24   24.5 Site4   24   24.2 
    #5 Site5   25   26 Site5   25   25.5 Site5   25   25.2 

Но это привело к SiteID колонке повторяется более чем один раз, в конечном data.frame результате bind_cols

Теперь, это может быть исправлено путем удаления повторного SiteID вручную или преобразование df, df_s2 и df_s3 в длинный data.frame, затем используя full_join по SiteID.

Есть ли лучший способ удалить столбец SiteID при объединении data.frames?

ответ

1

Вы можете поместить свои кадры данных в виде списка, а затем использовать Reduce функцию, чтобы присоединиться к ним по одному на SiteID колонке:

Reduce(dplyr::full_join, list(df, df_s2, df_s3)) 

# SiteID measured_s1 simulated_s1 measured_s2 simulated_s2 measured_s3 simulated_s3 
#1 Site1   21   22   21   21.5   21   21.2 
#2 Site2   22   23   22   22.5   22   22.2 
#3 Site3   23   24   23   23.5   23   23.2 
#4 Site4   24   25   24   24.5   24   24.2 
#5 Site5   25   26   25   25.5   25   25.2 

Или, чтобы избежать join процесса, и вы Помните, что все кадры данных выравниваются хорошо, вы можете удалить SiteID колонку с lapply и затем использовать do.call(bind_cols, ...):

bind_cols(df, do.call(bind_cols, lapply(list(df_s2, df_s3), `[`, -1))) 
+0

Большое спасибо за ваше время и помощь – aelwan

1

Мы можем использовать base R методы для выполнения этой

Reduce(function(...) merge(..., all = TRUE), mget(ls(pattern = "df.*"))) 
Смежные вопросы