r如果存 在,则更改列名列表

问题描述 投票:0回答:2

我在一个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")
r for-loop try-catch
2个回答
0
投票

我想到的一个解决方案是在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提到,你应该放一个可重复的例子:)


0
投票

如果有更优雅的方式,请告诉我。我正在使用@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)
© www.soinside.com 2019 - 2024. All rights reserved.