R语言 如何只绑定两个数据集的公共列

9bfwbjaz  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(76)

我有两个 Dataframe ,每个 Dataframe 有不同的列数。某些列在2个 Dataframe 之间是公用的。如何仅将两个数据框的公共列绑定到新数据框?
我尝试使用library(plyr);rbind.fill(A,B),但是它在不匹配的列中设置了NA值,这对我没有帮助。
非常感谢EC

camsedfj

camsedfj1#

使用intersect检索公共列。

dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5))
dfr2 <- data.frame(w = letters[1:5], x = 6:10, y = runif(5))
common_cols <- intersect(colnames(dfr1), colnames(dfr2))
rbind(
  subset(dfr1, select = common_cols), 
  subset(dfr2, select = common_cols)
)

字符串
正如注解中所指出的,您可以将最后一行替换为

rbind(
  dfr1[, common_cols], 
  dfr2[, common_cols]
)


对于性能和打字的小改进。

rbind(
  dfr1[common_cols], 
  dfr2[common_cols]
)


也可以,但我觉得有点不太清楚。
你也可以在最后一步使用dplyr的等价物。

library(dplyr)
bind_rows(
  dfr1 %>% select({common_cols}), 
  dfr2 %>% select({common_cols})
)

elcex8rz

elcex8rz2#

这是我的解决方案,希望我把你的问题回答对了

df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100))
df2 <- data.frame(a=rnorm(100), b=rnorm(100))

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)]
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)]

rbind(bind1, bind2)

字符串

yc0p9oo0

yc0p9oo03#

为我的个人软件包创建了自己的函数:(这也适用于2个以上的 Dataframe )

功能:

fast.rbind <- function(...,method=c("fill","common"),value=NA){
    if("fill"==method[1]) {
        fun1 <- function(x,y,value=NA){
            x[setdiff(colnames(y),colnames(x))] <- value

            y[setdiff(colnames(x),colnames(y))] <- value

            return(rbind(x,y))
        }
    }

    if("common"==method[1]) {
        fun1 <- function(x,y,value=NULL){
            common_cols <- intersect(colnames(x), colnames(y))
            return(rbind(x[, common_cols,drop=F],y[, common_cols,drop=F]))
        }
    }
    return(Reduce(function(x,y){fun1(x=x,y=y,value=value)},list(...)))
}

字符串

调用+示例数据:

df1 <- mtcars[1:5,1:4]
df2 <- mtcars[6:10,2:5]
df3 <- mtcars[11:15,4:7]
fast.rbind(df1,df2,df3,method="common")
fast.rbind(df1,df2,df3,value="yourDesiredFill")

rjee0c15

rjee0c154#

下面是一个有用的方法,可以在大规模的xlsx文件中实现这一点

# Set the path to the directory containing the xlsx files
data_folder <- "path/to/data_folder"

# List all the xlsx files in the data_folder
files <- list.files(path = data_folder, pattern = "\\.xlsx$", full.names = TRUE)

# Create a function to read the xlsx files and return column names
get_column_names <- function(file_path) {
  read_xlsx(file_path) %>% names()
}

# Get column names from all the files
column_names <- map(files, get_column_names)

# Find the common columns in all the files
common_columns <- reduce(column_names, intersect)

# Read and bind data from all the files, keeping only the common columns
combined_data <- map_df(files, ~ read_xlsx(.x) %>% select(all_of(common_columns)))

字符串

相关问题