【问题标题】:Compare columns across multiple data frames in R比较 R 中多个数据框的列
【发布时间】:2018-01-18 16:05:40
【问题描述】:

我正在分析存储在不同月度文件中的 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))

所有 4 个数据集应该看起来像 df1 和 df2,但 df3 对一个变量(“color”)和额外变量(“kids”)有不同的拼写,而 df4 颠倒了两个变量(“age”和“颜色”)。

我可以直观地检查列号和名称以识别问题,如下所示:

df.list <- list(df1,df2,df3,df4)
df.cols <- lapply(df.list, function(x) ncol(x))
df.names <- lapply(df.list, function(x) names(x))

输出

> 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" 

但我有更多的变量和数据集。有没有更有效的方法来自动和可重复地识别不匹配?我只找到了比较成对数据集的方法。感谢您的任何帮助或建议!

【问题讨论】:

  • 最好有一个list 的数据集,而不是在全局环境中创建多个对象。如果要获取列表中的所有对象。 mget(paste0("df", 1:4)) 用于匹配,也许stringdist 可能有用

标签: r


【解决方案1】:

一个简单的方法是

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" 

这样您可以同时验证名称和列(具有其他名称的附加列将在 nametest 中给出 FALSE)。 如果你想要错误列的索引:

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]
  })

【讨论】:

  • 谢谢@denis,工作完美!出于文档目的,我试图更进一步,并在 nametest 中的所有返回列表中索引所有 FALSE 元素。
  • 对不起,不完整。如何生成 nametest 的子集,它是所有 FALSE 元素的索引?所有的数据集都有问题,所以我想要一个所有不匹配的列表以用于文档目的。我一直在搜索和尝试无济于事,这是我最新的尝试,但不起作用。 probs &lt;- unlist(sapply(nametest, function(x) class(x)==FALSE))
  • 我发布了答案。如果它适合你,你可以接受答案。如果您还有其他问题,最好提出一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多