我在一个for循环中将一个文件列表绑定在一起,但是列的措辞和位置可以是不同的。例如,id(在第1列中)和itemID(在第3列中)是相同的,但在具有不同名称的不同位置。像这样的多个列在文件中传播。是否有方法给出我想要更改的列名列表,然后是我想要的新列名。我尝试使用'setnames',但它似乎没有工作。我假设因为可能有一个文件带有我想要的名字(itemId),然后是一个不受欢迎的名字(测试者),然后是另一个文件,反之亦然(不受欢迎的'ID'和所需的'测试')
这是我正在做的一个例子:
#change names of columns from old files
tryCatch({
setnames(tempPull,
old = c("ID", "tester"),
new = c( "ItemId", "Test"))},
error = function(e){})
这是另一个例子。 file#
是文件的外观,然后DesiredFormat
是我希望它看到最后的方式。我还提供了一个需要更改的名称列表以及应该更改的名称:
file1 <- data.frame(ItemId = 1:3, Test = letters[1:3])
file2 <- data.frame(ItemId = 4:7, Tester = letters[4:7])
file3 <- data.frame(ID = 7:10, Tester = letters[7:10])
file4 <- data.frame(ID = 11:12, Test = letters[11:12])
file5 <- data.frame(ID = 12:15, Testx = letters[12:15])
DesiredFormat <- data.frame(ItemId = 1:15, Test = letters[1:15])
oldnames <- c("ID", "Tester", "Testx")
newnames <- c("ItemId", "Test", "Test")
我想到的一个解决方案是在dplyr包中使用重命名功能:
df %>% select(a,b,c) %>% rename(d = a, e = b, f = c)
或者使用匹配
main_col <- c('a','b','c')
df.rename <- df %>%
dplyr::select(one_of(main_col))
namekey <- c(a = 'd', b = 'e', c = 'f')
names(df.rename) <- namekey[names(df.rename)]
希望能帮助到你。顺便提一下,@ MrFlick提到,你应该放一个可重复的例子:)
如果有更优雅的方式,请告诉我。我正在使用@Blue Phoenix响应的一部分,但是需要一些额外的步骤才能获得所有列。
#a list of columns to be renamed
#through out the files
chgCols <- c("ID", "Tester", "Testx")
#the names the columns will be changed to
namekey <- c(ID = "ItemId", Tester = "Test", Testx = "Test")
chgCols <- match(chgCols, colnames(tempPullList_2018)) #find any unwanted column indexes in data frame
chgCols <- chgCols[!is.na(chgCols)] #remove NA's if column found
chgCols <- colnames(tempPullList_2018[, chgCols]) #match indexes to column names
namekey <- namekey[chgCols] #associate name to be changed to namekey
tempPullList_2018 <- tempPullList_2018 %>% rename(namekey) #rename the columns in data frame
PullList_2018 <- rbindlist(list(PullList_2018, tempPullList_2018), fill = T)