簡體   English   中英

當列名不同時如何通過選擇特定列來組合多個數據框

[英]How to combine multiple dataframes by selecting specific columns when the column names are different

我在 my_data 列表中有七個my_data 其中三個 data.frames 有 16 列,另外四個有 22 列。 我需要將每個 data.frame 中的五列綁定到一個 data.frame ( all_data ) 中。 問題是我不能簡單地 select 我想按名稱保留的列,因為每個 data.frame 之間的名稱不同(但相似),並且順序不同。 例如,我有一個 data.frame 有一個標題為“X2012.NAICS.code”的列,另一個有一個標題為“X2007.NAICS.codes.and.NAICS.based.rollup.code”的列。 這些列包含相同的信息(NAICS 代碼)並且需要綁定在一起。 我嘗試使用的方法是這樣的:

header_cols <- c( "Geographic.area.name", "Year", "**3rd column**", "**4th column**", "**5th column**" )

all_data <- map_dfr( my_data[grepl( "^ASM", names( my_data ))], ~ 
                               .x %>%
                               select( header_cols ))

第 3、第 4 和第 5 列是我需要的其他三列(所有 7 個 data.frames 之間的YearGeographic.area.name相同)。

所有 data.frame 名稱都以“ASM”開頭,這就是^ASM的用途。

更新:我目前的策略是這樣的

# Make object for raw column name strings (all columns of interest contain these strings in all dataframes)
name_pattern <- c( "Geographic.area.name", "Geographic Area Name")
VoS_pattern <- c( "Total.value.of.shipment", "value of shipments")
NAICS_pattern <- c( "NAICS.code", "NAICS code")
industry_pattern <- c("Meaning.of.", "Meaning of NAICS code")
relative_pattern <- c("Relative.standard.error", "Relative standard error")
header_cols <- c( "Year" )

# Part 3: binding the data into one dataframe based on the columns of interest, uniting columns that contain the same information category
# Bind the columns of interest into one dataframe
combined_data <- map_dfr( my_data[grepl( "^ASM", names( my_data ))], ~
                            .x %>%
                            select( header_cols, contains( paste0( name_pattern ) ),
                                    contains( paste0( VoS_pattern ) ),
                                    contains( paste0( NAICS_pattern ) ),
                                    contains( paste0( industry_pattern ) ),
                                    -contains ( paste0( relative_pattern) ) ))

效果很好。 不幸的是,我不能使用map_dfr function(或任何特定於 purrr 的 function,所以我正在尋找一種使用 rbind 的方法。

一種選擇是在rename_at之后使用select標准化列名。

library(dplyr)
library(stringr)
library(purrr)
map_dfr(my_data[grep('^ASM', names(my_data))], ~ 
     .x %>%
       select(header_cols[1:2], 
            matches("NAICS\\.(code|based\\.rollup\\.code)")) %>%
       rename_at(matches("NAICS"), ~ str_remove(., "^X\\d{4}\\.")))

或使用base R使用lapply

v1 <- c("Year", "state_name", "VoS_thousUSD", "NAICS_code", "industry")

out <- lapply(my_data[grep('^ASM', names(my_data))],
       function(x) x %>%
           mutate_if(is.factor, as.character) %>%
          select( header_cols, contains( paste0( name_pattern ) ),
                  contains( paste0( VoS_pattern ) ),
                  contains( paste0( NAICS_pattern ) ),
                 contains( paste0( industry_pattern ) ),
                -contains ( paste0( relative_pattern) ) ) %>% 
                set_names(v1))

combined_data <- do.call(rbind, out)
row.names(combined_data) <- NULL


# Make VoS numeric
combined_data_new <- combined_data %>%
        dplyr::mutate( VoS_thousUSD = as.numeric( VoS_thousUSD ) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM