簡體   English   中英

使用數據框列表將功能應用於列名稱

[英]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很容易使用lapplyfor循環使用它們,而是作為單獨的對象,你會抄/粘貼代碼並犯錯誤。


我甚至會考慮從工作空間中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM