簡體   English   中英

如何根據另一個數據框的列選擇數據框的列

[英]How to select columns of a data frame based on the columns of another data frame

我有一個數據框 df_1_2017,有 38 列。 我有另一個數據框 df_2_2018,有 43 列。 我想要相同數量的列/標題名稱,以便我可以輕松地 cbind 兩個數據框。

我已經嘗試了以下沒有任何運氣

col_names_2017 <- colnames(df_1_2017)

selected_cols_df_2_2018 <- df_2_2018 %>%
      select(col_names_2017)

Error in `select()`:
! Can't subset columns that don't exist.
✖ Column `Canopy_cover_mean` doesn't exist.

如果 df_1_2017 中的 colnames 出現在 df_2_2018 中,我如何合並一個選擇,然后選擇兩個數據框共享的所有列。

您可以使用

common_colsnms <- intersect(colnames(df_1_2017) , colnames(df_2_2018))

# apply

selected_cols_df_2_2018 <- df_2_2018 %>%
      select(common_colsnms)

請參閱https://dplyr.tidyverse.org/reference/dplyr_tidy_select.html以供將來參考。 讓我知道這個是否奏效。

col_names_2017 <- colnames(df_1_2017)

selected_cols_df_2_2018 <- df_2_2018 %>%
      select(all_of(col_names_2017))

如果您真的是指cbind ,那么它與列的數字或名稱無關(嗯,不鼓勵重復名稱,但可能)。 在這種情況下,您應該查看每個中的行數,以及它們是否按行對齊; 通常它們要么是完全匹配的(行數相同,每行意味着相同的東西),要么它們具有需要連接/合並操作的共享 ID 字段。

但是,如果您的意思是rbind ,而您覺得需要按名稱匹配,那么您有幾個選擇。

鹼基R

mt2 <- mtcars[1:3,]
mt3 <- mtcars[4:6,]
names(mt2)[3:5] <- paste(names(mt2)[3:5], "_2")
names(mt2)[6:8] <- paste(names(mt2)[3:5], "_3")
mt2 <- mtcars[1:3,]
mt3 <- mtcars[4:6,]
names(mt2)[3:5] <- paste(names(mt2)[3:5], "_2")
names(mt3)[6:8] <- paste(names(mt3)[6:8], "_3")
mt2
#                mpg cyl disp_2 hp_2 drat_2    wt  qsec vs am gear carb
# Mazda RX4     21.0   6    160  110   3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag 21.0   6    160  110   3.90 2.875 17.02  0  1    4    4
# Datsun 710    22.8   4    108   93   3.85 2.320 18.61  1  1    4    1
mt3
#                    mpg cyl disp  hp drat  wt_3 qsec_3 vs_3 am gear carb
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215  19.44    1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440  17.02    0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460  20.22    1  0    3    1

common <- intersect(names(mt2), names(mt3))
mt2[,common]
#                mpg cyl am gear carb
# Mazda RX4     21.0   6  1    4    4
# Mazda RX4 Wag 21.0   6  1    4    4
# Datsun 710    22.8   4  1    4    1
mt3[,common]
#                    mpg cyl am gear carb
# Hornet 4 Drive    21.4   6  0    3    1
# Hornet Sportabout 18.7   8  0    3    2
# Valiant           18.1   6  0    3    1
rbind(mt2[,common], mt3[,common])
#                    mpg cyl am gear carb
# Mazda RX4         21.0   6  1    4    4
# Mazda RX4 Wag     21.0   6  1    4    4
# Datsun 710        22.8   4  1    4    1
# Hornet 4 Drive    21.4   6  0    3    1
# Hornet Sportabout 18.7   8  0    3    2
# Valiant           18.1   6  0    3    1

dplyr,限制名稱

library(dplyr)
rbind(select(mt2, any_of(names(mt3))), select(mt3, any_of(names(mt2))))
#                    mpg cyl am gear carb
# Mazda RX4         21.0   6  1    4    4
# Mazda RX4 Wag     21.0   6  1    4    4
# Datsun 710        22.8   4  1    4    1
# Hornet 4 Drive    21.4   6  0    3    1
# Hornet Sportabout 18.7   8  0    3    2
# Valiant           18.1   6  0    3    1

或者使用更靈活的bind_rows

select(mt2, any_of(names(mt3))) %>%
  bind_rows(select(mt3, any_of(names(mt2))))
#                    mpg cyl am gear carb
# Mazda RX4         21.0   6  1    4    4
# Mazda RX4 Wag     21.0   6  1    4    4
# Datsun 710        22.8   4  1    4    1
# Hornet 4 Drive    21.4   6  0    3    1
# Hornet Sportabout 18.7   8  0    3    2
# Valiant           18.1   6  0    3    1

dplyr,接受所有列

如果您不太關心額外的列,那么您可以使用bind_rows及其固有的按名稱對齊列的能力,並在一幀中創建未找到的列。

bind_rows(mt2, mt3)
#                    mpg cyl disp_2 hp_2 drat_2    wt  qsec vs am gear carb disp  hp drat  wt_3 qsec_3 vs_3
# Mazda RX4         21.0   6    160  110   3.90 2.620 16.46  0  1    4    4   NA  NA   NA    NA     NA   NA
# Mazda RX4 Wag     21.0   6    160  110   3.90 2.875 17.02  0  1    4    4   NA  NA   NA    NA     NA   NA
# Datsun 710        22.8   4    108   93   3.85 2.320 18.61  1  1    4    1   NA  NA   NA    NA     NA   NA
# Hornet 4 Drive    21.4   6     NA   NA     NA    NA    NA NA  0    3    1  258 110 3.08 3.215  19.44    1
# Hornet Sportabout 18.7   8     NA   NA     NA    NA    NA NA  0    3    2  360 175 3.15 3.440  17.02    0
# Valiant           18.1   6     NA   NA     NA    NA    NA NA  0    3    1  225 105 2.76 3.460  20.22    1

暫無
暫無

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

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