【发布时间】: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”。