这可能是一个不好的问题,因为我没有发布任何可重复的例子。我的主要目标是识别两个数据框之间具有相同列名称的不同类型的列。
例如
DF1
Id Col1 Col2 Col3
Numeric Factor Integer Date
DF2
Id Col1 Col2 Col3
Numeric Numeric Integer Date
这里两个数据帧(df1,df2)都有相同的列名,但Col1类型不同,我有兴趣识别这些列。预期产出。
Col1 Factor Numeric
有关实现此目的的任何建议或提示吗?感谢
答案 0 :(得分:3)
对于更紧凑的方法,您可以使用包含sapply()
的列表。效率不应成为问题,因为我们所做的就是抓住课堂。在这里,我将数据框名称添加到列表中以创建更清晰的输出。
m <- sapply(list(df1 = df1, df2 = df2), sapply, class)
m[m[, "df1"] != m[, "df2"], , drop = FALSE]
# df1 df2
# Col1 "factor" "character"
其中df1
和df2
是来自@ 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)
我们可以sapply
与class
一起使用df1
和df2
中的所有列。之后,我们可以比较结果。
# 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
自我促销警报,我编写了此程序包-正在发布此功能,因为它确实可以解决此问题。