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