[英]apply function to column names using a list of data frames
我正在嘗試將非常復雜的功能應用於50多個數據幀的列表。 為了清楚起見,讓我們使用一個非常簡單的函數來小寫名稱和3個數據幀,但是我的通用方法編碼如下
[EDITED NAMES]
# Data Sample. Every column name is different accross Data Frames
quality <- data.frame(FIRST=c(1,5,3,3,2), SECOND=c(3,6,1,5,5))
thickness <- data.frame(THIRD=c(6,0,9,1,2), FOURTH=c(2,7,2,2,1))
distance <- data.frame(ONEMORE=c(0,0,1,5,1), ANOTHER=c(4,1,9,2,3))
# list of dataframes
dfs <- list(quality, thickness, distance)
# a very simple function (just for testing)
# actually a very complex one is used on real data
BetterNames <- function(x) {
names(x) <- tolower(names(x))
x
}
# apply function to data frame list
dfs <- lapply(dfs, BetterNames)
# I know the expected R behaviour is to modify a copy of the object,
# instead of the original object itself. So if you get the names
# you get the original version, not the needed one
names(quality)
[1] "FIRST" "SECOND"
有沒有辦法在循環內使用任何函數或“應用”大量數據幀?
結果,我們必須獲得修改后的數據,以替換列表(大列表)中的每個數據幀的原始數據。
我知道使用數據表有一個技巧,但是我想知道是否可以使用基數R。
預期成績:
names(quality)
[1] "first" "second"
[編輯]指出了這個答案: 重命名多個數據框中的列,R
但是沒有用。 在我的情況下,您不能使用字符串名稱的向量,因為我的新名稱不是固定的字符串列表。[編輯數據]
for(df in dfs) {
df.tmp <- get(df)
names(df.tmp) <- BetterNames(df)
assign(df, df.tmp)
}
> names(quality)
[1] "quality" NA
謝謝
您已經有了最好的情況:
讓我們為列表添加一些名稱:
names(dfs) <- c("quality", "thickness", "distance")
dfs <- lapply(dfs, BetterNames)
dfs[["quality"]]
# first second
# 1 1 3
# 2 5 6
# 3 3 1
# 4 3 5
# 5 2 5
這很好。 而且所有數據都在列表中,因此,如果要對所有數據框執行其他操作,這非常容易。
如果您完成了對這些數據幀的類似處理,並且確實希望它們在全局環境中可以單獨使用,則可以使用
list2env(dfs, envir = .GlobalEnv)
我建議,雖然他們留在列表---在大多數情況下,如果你有你正在使用50個的數據幀,在list
很容易使用lapply
或for
循環使用它們,而是作為單獨的對象,你會抄/粘貼代碼並犯錯誤。
我甚至會考慮從工作空間中的50個數據幀開始,這是一個問題-請參閱如何制作數據幀列表? 有關查找上游修補程序的建議:從頭開始直接查找列表。
我會使用一種簡單而有效的解析與評估方法。
讓我們使用一個for循環來編寫適合您需求的命令:
for(df in dfs) {
command <- paste0("names(",df,") <- BetterNames(",df,")")
# print(command)
eval(parse(text=command))
}
names(quality)
[1] "first" "second"
names(thickness)
[1] "third" "fourth"
names(distance)
[1] "onemore" "another"
這肯定不是最佳選擇,我希望能有更好的結果,但是可以解決:
BetterNames <- function(x, y) {
names(x) <- tolower(names(x))
assign(y, x, envir = .GlobalEnv)
}
dfs <- list(quality, thickness, distance)
dfs2 <- c("quality", "thickness", "distance")
mapply(BetterNames, dfs, dfs2)
> names(quality)
[1] "first" "second"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.