簡體   English   中英

在數據幀列表上應用函數的有效方法

[英]An efficient way to apply a function over a list of dataframes

我在R中有一個數據幀列表。我需要做的是將函數應用於每個數據幀,在這種情況下刪除特殊字符,並返回一個數據幀列表。

使用lapplyas.data.frame ,以下工作正常,並提供我所需要的:

my_df =data.frame(names = seq(1,10), chars = c("abcabc!!", "abcabc234234!!"))
my_list = list(my_df, my_df, my_df)

#str(my_list)
List of 3
 $ :'data.frame':   10 obs. of  2 variables: ...

new_list <- lapply(my_list, function(y) as.data.frame(lapply(y, function(x) gsub("[^[:alnum:][:space:]']", "", x))))

# str(new_list)
List of 3
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ names: Factor w/ 10 levels "1","10","2","3",..: 1 3 4 5 6 7 8 9 10 2
  ..$ chars: Factor w/ 2 levels "abcabc","abcabc234234": 1 2 1 2 1 2 1 2 1 2
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ names: Factor w/ 10 levels "1","10","2","3",..: 1 3 4 5 6 7 8 9 10 2
  ..$ chars: Factor w/ 2 levels "abcabc","abcabc234234": 1 2 1 2 1 2 1 2 1 2
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ names: Factor w/ 10 levels "1","10","2","3",..: 1 3 4 5 6 7 8 9 10 2
  ..$ chars: Factor w/ 2 levels "abcabc","abcabc234234": 1 2 1 2 1 2 1 2 1 2

但我想知道是否有一種更有效的方法,不需要嵌套lapply 也許是一個不同的apply-family函數,它將元素作為數據幀返回?

我們不需要嵌套的lapply ,只需要一個帶transform lapply就可以了

lapply(my_list, transform, chars = gsub("[^[:alnum:][:space:]']", "", chars))

模式可以緊湊為"[^[[:alnum:] ']"

雖然@akrun是正確的,你的第二次lapply調用在這個例子中是無用的,但我認為它並沒有解決許多列可能相關的一般情況,並且它可能是未知的。

這里效率低下的是使用as.data.frame轉換回來,而不是內部lapply調用。 lapply調用本身幾乎與將函數應用於單個向量或相同大小的矩陣一樣快。

如果你真的想在這里更節省時間,我建議使用data.table 我已經做了一個更大的例子,所以我們可以計時。

library(data.table)

f <- function(x) gsub("[^[:alnum:][:space:]']", "", x)

my_df <- as.data.frame(matrix(paste0(sample(c(letters,'!'), size=1000000, replace=T),
                                 sample(c(letters,'!'), size=1000000, replace=T)), 
                                 ncol=250), stringsAsFactors = FALSE)
my_list = list(my_df, my_df, my_df)

system.time(lapply(my_list, function(y) as.data.frame(lapply(y, f))))
# 2.256 seconds

my_dt <- as.data.table(my_df)
my_list2 = list(my_dt, my_dt, my_dt)

system.time(lapply(my_list2, function(y) y[,lapply(.SD,f)]))
# 1.180 seconds

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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