【问题标题】:r - Change Variable Column Names in Functionr - 更改函数中的变量列名称
【发布时间】:2018-08-09 21:33:38
【问题描述】:

下面是一个名为change_names 的function,它有效,但仅适用于特定的数据框名称。简而言之,我在理解如何操作 assign 函数以便它可以处理不同的数据框名称时遇到问题。

function 基本上改变了我在for loop 中读取文件列上的名称。例如,一个文件的列名可能是'A',应该是'X',而另一个文件的列名可能是'D',也应该是'X'。

我已经尝试了几个不同的渠道来实际更改原始数据帧'tempPullList',但我需要能够在不同的数据帧上使用该功能。

#====example different files====
file1 <- data.frame(A = rep(1:10), Y = rep(c("Yellow","Red","Purpule","Green","Blue"), 2),
                    Z = rep(c("Drink", "Food"), 5))

file2 <- data.frame(D = rep(1:10), B = rep(c("Brown","Pink","Purpule","Green","Blue"), 2),
                    Z = rep(c("Drink", "Food"), 5))

file3 <- data.frame(X = rep(1:10), B = rep(c("Brown","Pink","Purpule","Green","Blue"), 2),
                    C = rep(c("Drink", "Food"), 5))

file_list <- list(file1, file2, file3)


#====Package Bank====
library(data.table)
library(dplyr)

#====Function====
change_names <- function(x){

  #a list of columns to be renamed
  #through out the files
  chgCols <- c("A",
               "B",
               "C",
               "D")

  #the names the columns will be changed to
  namekey <- c(A = "X",
               B = "Y",
               C = "Z",
               D = "X")

  chgCols <- match(chgCols, colnames(x))               #find any unwanted column indexes in data frame
  chgCols <- colnames(x[, chgCols[!is.na(chgCols)]])   #match indexes to column names w/o NA's

  x <- x %>%                                           #rename associated columns
    plyr::rename(namekey[chgCols])                     #from 'namekey' in dataframe

  assign('tempPullList', x, envir = .GlobalEnv)

}



#====Read in Files====

PullList <- data.frame()
for(file in 1:length(file_list)){
  tempPullList <- data.frame(file_list[file])
  print(file)

  change_names(x = tempPullList)
  PullList <- rbindlist(list(PullList, tempPullList),
                          fill = T)
}

再说一次,现在我只能在数据框被称为“tempPullList”时才能做到这一点,我需要能够使用另一个数据框来做到这一点。

我对编写函数非常陌生,尤其是在函数中分配变量。我希望这个函数尽可能多变。我目前正在努力使chgCols 和namekey 成为输入。所以任何关于这方面的建议也会有所帮助

【问题讨论】:

  • 你能解释一下tempPullList和x之间的关系吗?或者提供一个典型输入和预期输出的示例?
  • 接下来,我无法理解为什么您不简单地使用 return(x) 而不是使用命名空间,这通常不是一个好主意。
  • 仅供参考,您不能拥有包含名为“X”的两列的数据框。为了防止命名问题,r 可能会自动将第二个“X”列重命名为“X.1”
  • 我错了……你可以让它有两次相同的列名……但是以后会出问题。 df$X 将忽略第二列。
  • @AdamSampson 我有多个文件正在读取。其中一个可能有“A”列,另一个可能有“D”列,但是它们都应该被标记为“X”他们都是一回事。实际上,每个文件的列标题到处都是。想想,'ID'、'ItemID'、Item.Id、ItemId 等。我希望它们都是'ItemId'。为简单起见,我将“ItemId”更改为“X”。

标签: r function assign


【解决方案1】:

示例数据:

column_name_lookup <- data.frame(orig = c("a","b","c","d"),
                                 new = c("X","Y","z","X"),
                                 stringsAsFactors = FALSE)

test_df <- data.frame(a = 1:5,
                      c = 2:6,
                      b = 3:7,
                      e = 4:8,
                      d = 5:9)
  a c b e d
1 1 2 3 4 5
2 2 3 4 5 6
3 3 4 5 6 7
4 4 5 6 7 8
5 5 6 7 8 9

改名代码:

new_names <- column_name_lookup$new[match(names(test_df),column_name_lookup$orig)]

names(test_df) <- ifelse(is.na(new_names),names(test_df),new_names)
  X z Y e X
1 1 2 3 4 5
2 2 3 4 5 6
3 3 4 5 6 7
4 4 5 6 7 8
5 5 6 7 8 9

【讨论】:

  • 请查看我的编辑,并提供更可重复的示例。
猜你喜欢
  • 2021-03-31
  • 1970-01-01
  • 2019-01-31
  • 2022-01-13
  • 2013-02-27
  • 2015-11-11
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多