我正试图使用select{dplyr}将列从DT提取到新的DT
extract_Data <- select(.data = master_merge, subjectID, activity_ID,
contains("mean\(\)"), contains("std\(\)"))
共有563列,因此我要求提取第一列和第二列(主题、活动)以及存在mean()或std()的所有其他列。
这里没有可以创建的重复列。弄不明白为什么。我尝试过select的各种变体,但总是出现错误:列名重复。
我该如何解决这个问题?我已经检查了所有563个列名,没有重复的。
问题的根源是原始列名中的无效字符。R中的变量名称限制中的讨论也适用于列名。尝试使用make.names().强制使用带有有效字符的唯一列名
valid_column_names <- make.names(names=names(master_merge), unique=TRUE, allow_ = TRUE)
names(master_merge) <- valid_column_names
这是我找到的解决方案:
data <- data[ , !duplicated(colnames(data))]
这会在没有所有重复列的情况下对数据集进行子集设置。
希望能有所帮助。
重复匹配过滤器可能导致"重复名称"错误。示例:
library(dplyr)
x <- data.frame(1, 2, 3)
names(x) <- c("a", "a", "b")
x %>%
select(matches("b"))
如果您不需要这些列,请使用消除它们
x <- x[ !duplicated(names(x)) ]
这不是一个直接的答案,但这将帮助很多人。
对于所有Coursera的学生来说,这个数据集面临着这个问题:有重复的列名。例如,"fBodyAccJerk-bandsEnergy()-1,16"被找到两次。检查:
your_merged_data_with_column_ames[,400:420]
我很想显示输出,但我的浏览器既不支持"代码"按钮,也不支持ctrl-K快捷方式,而且数据太多,无法手动缩进。亲自尝试此代码,并仔细检查"未显示的变量"!
我现在正在自己研究一个解决方案,可能使用上面的答案,也可能使用课程论坛。
基于Lantana的伟大答案,这里有一个用于具有pipe
集成的纯dplyr
解决方案的函数:
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
我对同样的错误感到困惑。避免使用select。如果meanStdcolumns是包含mean或std的列的列表(可以使用grep获得),那么master_merge[,meanStdccolumns]似乎可以工作。
在分配列名之前,通过使用获取索引列表来过滤列
meanStdColumns <- grep("mean|std", features$V2, value = FALSE)
然后使用分配列名
meanStdColumnsNames <- grep("mean|std", features$V2, value = TRUE)