r比较两个数据帧之间的列类型

时间:2017-08-17 19:57:35

标签: r dataframe difference

这可能是一个不好的问题,因为我没有发布任何可重复的例子。我的主要目标是识别两个数据框之间具有相同列名称的不同类型的列。

例如

DF1

 Id      Col1      Col2     Col3
 Numeric Factor    Integer  Date

DF2

 Id      Col1      Col2     Col3
 Numeric Numeric    Integer  Date

这里两个数据帧(df1,df2)都有相同的列名,但Col1类型不同,我有兴趣识别这些列。预期产出。

Col1  Factor    Numeric

有关实现此目的的任何建议或提示吗?感谢

5 个答案:

答案 0 :(得分:3)

对于更紧凑的方法,您可以使用包含sapply()的列表。效率不应成为问题,因为我们所做的就是抓住课堂。在这里,我将数据框名称添加到列表中以创建更清晰的输出。

m <- sapply(list(df1 = df1, df2 = df2), sapply, class)
m[m[, "df1"] != m[, "df2"], , drop = FALSE]
#      df1      df2        
# Col1 "factor" "character"

其中df1df2是来自@ ycw答案的数据。

答案 1 :(得分:2)

如果两个数据框具有相同的列名,则下面将为您提供具有不同类的列。

library(dplyr)
m1 = mtcars
m2 = mtcars %>% mutate(cyl = factor(cyl), vs = factor(cyl))
out = cbind(sapply(m1, class), sapply(m2, class))
out[apply(out, 1, function(x) !identical(x[1], x[2])), ]

答案 2 :(得分:1)

试试这个:

compareColumns <- function(df1, df2) {
  commonNames <- names(df1)[names(df1) %in% names(df2)]
  data.frame(Column = commonNames,
             df1 = sapply(df1[,commonNames], class),
             df2 = sapply(df2[,commonNames], class)) }

答案 3 :(得分:0)

我们可以sapplyclass一起使用df1df2中的所有列。之后,我们可以比较结果。

# Create example data frames
df1 <- data.frame(ID = 1:3,
                  Col1 = as.character(2:4),
                  Col2 = 2:4,
                  Col3 = as.Date(paste0("2017-01-0", 2:4)))

df2 <- data.frame(ID = 1:3,
                  Col1 = as.character(2:4),
                  Col2 = 2:4,
                  Col3 = as.Date(paste0("2017-01-0", 2:4)),
                  stringsAsFactors = FALSE)

# Use sapply and class to find out all the class
class1 <- sapply(df1, class)
class2 <- sapply(df2, class)

# Combine the results, then filter for rows that are different
result <- data.frame(class1, class2, stringsAsFactors = FALSE)
result[!(result$class1 == result$class2), ]
     class1    class2
Col1 factor character

答案 4 :(得分:0)

尝试使用看门人软件包中的compare_df_cols()

library(janitor)
mtcars2 <- mtcars
mtcars2$cyl <- as.character(mtcars2$cyl)
compare_df_cols(mtcars, mtcars2, return = "mismatch")

#>   column_name  mtcars   mtcars2
#> 1         cyl numeric character

自我促销警报,我编写了此程序包-正在发布此功能,因为它确实可以解决此问题。