【问题标题】:dplyr "Select" - Error: found duplicated column namedplyr“选择” - 错误:发现重复的列名
【发布时间】:2015-04-17 09:55:37
【问题描述】:

我正在尝试使用 select{dplyr} 将列从 DT 提取到新 DT

extract_Data <- select(.data = master_merge, subjectID, activity_ID,
                           contains("mean\\(\\)"), contains("std\\(\\)"))

有 563 列,所以我要求提取第一列和第二列(主题、活动)以及存在 mean() 或 std() 的所有其他列。

这里不能创建重复的列。很困惑为什么。我已经尝试了 select 的所有变体,但总是 Error: Duplicated Column name。

我该如何解决这个问题 - 我已经检查了所有 563 个列名并且没有重复。

【问题讨论】:

  • 如果您使用matches("(mean|std)\\(.*\\)") 而不是当前的两个contains 语句怎么办? ...编辑为使用matches 而不是contains
  • 同样的错误“错误:发现重复的列名”
  • 还有matches
  • 您能否将问题缩小到仍然出现错误的程度,并且您可以提供数据集的列名?
  • 继续在 cmets 和可能的答案下没有意义。提供一个可重复的例子,歧义就会消失。

标签: r dplyr


【解决方案1】:

问题的根源在于原始列名中的无效字符。 Variable Name Restrictions in R 中的讨论也适用于列名。尝试使用 make.names() 强制使用 valid 字符的唯一列名。

valid_column_names <- make.names(names=names(master_merge), unique=TRUE, allow_ = TRUE)
names(master_merge) <- valid_column_names

【讨论】:

  • 优秀的解决方案。非常简洁和概括。
【解决方案2】:

这是我找到的解决方案:

data <- data[ , !duplicated(colnames(data))]

这对数据集进行了子集化,没有所有重复的列。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    不匹配过滤器重复可能会导致“重复名称”错误。示例:

    library(dplyr)
    x <- data.frame(1, 2, 3)
    names(x) <- c("a", "a", "b")
    
    x %>%
      select(matches("b"))
    

    如果您不需要这些列,请删除它们

    x <- x[ !duplicated(names(x)) ]
    

    【讨论】:

    • 这很清楚 - 我不明白为什么这是作为重复返回的 - fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-9,16" 和 " fBodyGyro-bandsEnergy()-1,24" "fBodyGyro-bandsEnergy()-25,48"
    • 但它们不是重复的!
    • duplicated 函数不会返回第一次出现的重复项。试试which(names(master_merge) == "fBodyAcc-bandsEnergy()-1,8")
    • 它确实返回了重复项。对不起。
    • 我也看到了这个错误。当我使用 duplicated() 函数检查哪些列名被视为重复时,看起来“-”之后的数字字符(可能包括“-”)被忽略了。这些函数似乎将列名视为“fBodyAcc-bandsEnergy()”的多个副本、“fBodyGyro-bandsEnergy()”的多个副本等,没有“-1,8”和“-9”, 16" 确实使列名唯一。我还没有关于如何解决这个问题的答案,只是提供这个线索,说明为什么在没有实际重复的列时会看到该错误。
    【解决方案4】:

    不是直接的答案,但这会帮助很多人。

    对于所有在使用此数据集时遇到此问题的 Coursera 学生: 列名称重复。例如,“fBodyAccJerk-bandsEnergy()-1,16”被发现两次。检查:

    your_merged_data_with_column_names[,400:420]

    我很想显示输出,但我的浏览器不支持“代码”按钮或 ctrl-K 快捷方式,而且有太多数据需要手动缩进。亲自尝试此代码并仔细检查“未显示的变量”!

    我自己现在正在研究解决方案,可能使用上述答案或课程论坛。

    【讨论】:

      【解决方案5】:

      基于Lantana great answer,这是一个纯dplyr 解决方案与pipe 集成的函数:

      validate.names = function(df){
        rtn = df
        valid_column_names = make.names(names=names(df), unique=TRUE, allow_ = TRUE)
        names(rtn) = valid_column_names
        rtn
      }
      

      你可以像这样使用它:

      extract_Data %>% validate.names
      

      【讨论】:

        【解决方案6】:

        我对同样的错误感到困惑。避免使用选择。如果 meanStdcolumns 是包含 mean 或 std 的列列表(您可以使用 grep 获得),那么 master_merge[,meanStdcolumns] 似乎可以工作。

        【讨论】:

          【解决方案7】:

          在分配列名之前,通过使用获取索引列表过滤掉列

          meanStdColumns <- grep("mean|std", features$V2, value = FALSE)
          

          然后使用

          分配列名
          meanStdColumnsNames <- grep("mean|std", features$V2, value = TRUE)
          

          【讨论】:

            猜你喜欢
            • 2017-06-19
            • 1970-01-01
            • 2021-10-15
            • 2017-04-13
            • 2014-02-18
            • 2017-09-05
            • 2021-04-06
            • 2017-10-14
            相关资源
            最近更新 更多