我正在尝试使用select {dplyr}
将DT中的列提取到新DTextract_Data <- select(.data = master_merge, subjectID, activity_ID,
contains("mean\\(\\)"), contains("std\\(\\)"))
有563列,所以我要求提取第一列和第二列(主题,活动)以及存在mean()或std()的所有其他列。
此处无法创建重复列。所以难以理解为什么。我已经尝试了select的每个变体,但总是错误:重复的列名。
我如何解决这个问题 - 我已经浏览了所有563列名称,并且没有重复项。
答案 0 :(得分:31)
问题的根源是原始列名称中的无效字符。 Variable Name Restrictions in R中的讨论也适用于列名。尝试使用make.names()强制使用有效字符的唯一列名。
valid_column_names <- make.names(names=names(master_merge), unique=TRUE, allow_ = TRUE)
names(master_merge) <- valid_column_names
答案 1 :(得分:12)
以下是我找到的解决方案:
data <- data[ , !duplicated(colnames(data))]
此子集不包含所有重复列的数据集。
希望它有所帮助。
答案 2 :(得分:8)
重复出匹配过滤器可能导致&#34;重复的名称&#34;错误。例如:
library(dplyr)
x <- data.frame(1, 2, 3)
names(x) <- c("a", "a", "b")
x %>%
select(matches("b"))
如果您不需要这些列,请使用
删除它们x <- x[ !duplicated(names(x)) ]
答案 3 :(得分:0)
不是直接的答案,但这会对很多人有所帮助。
对于所有使用此数据集遇到此问题的Coursera学生:是重复的列名。例如,&#39; fBodyAccJerk-bands能量() - 1,16&#39;被发现两次。检查:
your_merged_data_with_column_names [400:420]
我喜欢显示输出,但我的浏览器不支持&#39;代码&#39;按钮也不是ctrl-K快捷方式,并且手动缩进的数据太多。请亲自试用此代码,并仔细检查未显示的变量&#39;!
我现在正在研究解决方案,可能使用上述答案或课程论坛。
答案 4 :(得分:0)
基于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
答案 5 :(得分:-1)
我对同样的错误感到困惑。避免使用选择。如果meanStdcolumns是包含mean或std的列的列表(你可以使用grep获得),那么master_merge [,meanStdcolumns]似乎可以工作。
答案 6 :(得分:-3)
在分配列名之前,通过使用
获取索引列表来过滤列meanStdColumns <- grep("mean|std", features$V2, value = FALSE)
然后使用
分配列名称meanStdColumnsNames <- grep("mean|std", features$V2, value = TRUE)