比较R中多个数据帧中的列

比较R中多个数据帧中的列,r,R,我正在分析5年内存储在单独月度文件中的数据。每个数据集的行数和行数(案例)不同,但应具有相同的变量和变量名。然而,通过查看它们,我知道有些并没有,在将所有数据集合并到一个数据帧之前,我必须对它们进行操作。有没有办法自动化识别这些信息的过程,特别是记录我所做的更改 例如,假设我有以下4个数据集: df1 <- data.frame(id = c(1, 2, 3), age = c(10, 20, 30), color = c("green", "purple", "gold"

我正在分析5年内存储在单独月度文件中的数据。每个数据集的行数和行数(案例)不同,但应具有相同的变量和变量名。然而,通过查看它们,我知道有些并没有,在将所有数据集合并到一个数据帧之前,我必须对它们进行操作。有没有办法自动化识别这些信息的过程,特别是记录我所做的更改

例如,假设我有以下4个数据集:

df1 <- data.frame(id = c(1, 2, 3), age = c(10, 20, 30), color = 
       c("green", "purple", "gold"))
df2 <- data.frame(id = c(1, 2, 3, 4), age = c(10, 20, 30, 40), color = 
       c("green", "purple", "gold", "blue"))
df3 <- data.frame(id = c(1, 3, 4), age = c(10, 30, 40), colour = 
       c("green", "gold", "blue"), kids = c(0, 1, 1))
df4 <- data.frame(id = c(1, 2, 4), color = c("green", "purple", 
       "blue"), age = c(10, 20, 40))
但我有更多的变量和数据集。是否有一种更有效的方法来实现这一点,即自动且重复地识别不匹配?我只找到了跨成对数据集进行比较的方法。谢谢你的帮助和建议

一个简单的方法是

dflist <- mget(paste0("df", 1:4))

nametest <- sapply(dflist,function(x){names(x) %in% names(df1)})
$df1
[1] TRUE TRUE TRUE

$df2
[1] TRUE TRUE TRUE

$df3
[1]  TRUE  TRUE FALSE FALSE

$df4
[1] TRUE TRUE TRUE

dflist最好有一个数据集的
列表,而不是在全局环境中创建多个对象。如果要获取列表中的所有对象
mget(paste0(“df”,1:4))
对于匹配,也许
stringdist
可能有用谢谢@denis,工作得很好!出于文档的目的,我正在尝试更进一步,在
nametest
中为所有返回列表中的所有FALSE元素编制索引。很抱歉,这是不完整的。如何生成
nametest
的子集,它是所有FALSE元素的索引?所有的数据集都有问题,所以我想要一个包含所有不匹配项的列表,以便于文档编制。我一直在搜索和尝试,但都无济于事,这是我最近的一次尝试,但没有成功<代码>问题我发布了答案。如果它适合你,你可以接受答案。如果你有进一步的问题,最好是问一个新问题
> df.cols
[[1]]
[1] 3

[[2]]
[1] 3

[[3]]
[1] 4

[[4]]
[1] 3

> df.names
[[1]]
[1] "id"    "age"   "color"

[[2]]
[1] "id"    "age"   "color"

[[3]]
[1] "id"     "age"    "colour" "kids"  

[[4]]
[1] "id"    "color" "age" 
dflist <- mget(paste0("df", 1:4))

nametest <- sapply(dflist,function(x){names(x) %in% names(df1)})
$df1
[1] TRUE TRUE TRUE

$df2
[1] TRUE TRUE TRUE

$df3
[1]  TRUE  TRUE FALSE FALSE

$df4
[1] TRUE TRUE TRUE
quickview <- unlist(sapply(nametest,function(x){if(!all(x))"name pb"}))
      df3 
"name pb" 
index <- sapply(dflist,function(x){
  which(!names(x) %in% names(df1))})

$df1
integer(0)

$df2
integer(0)

$df3
[1] 3 4

$df4
integer(0)
wrongnames <- sapply(dflist,function(x){
  indx <- which(!names(x) %in% names(df1))
  names(x)[indx]
  })