簡體   English   中英

將函數應用於data.frame的每一列並組織輸出

[英]Apply a function to each column of a data.frame and organize the output

我有這個向量:

 x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)

我使用此功能:

myfunction <- function(x){
     n <- length(x)
     fx <- numeric(n)
     fx[1] <- min(x[1],0)
     for(i in 2:n){fx[i] <- min(0,fx[i-1]+x[i])}
     fx

     x_min <-min(x)
     fx_min <- min(fx)

     fx_05 <- numeric(n)
     fx_05[1] <- min(fx[1],0)
     for (i in 2:n) {
       if (sum(fx_05[i-1]+x[i])>0) {  
          fx_05[i] <- 0
       } else if ((sum(fx_05[i-1]+x[i]))<(fx_min*0.5)) {
          fx_05[i] <- (fx_min*0.5)
       } else { fx_05[i] <- sum(fx_05[i-1]+x[i]) }
     }
     fx_05
     as.data.frame(matrix(c(x, fx_05), ncol = 2 ))
}
xx <- myfunction(x)

數據框xx

    V1   V2
1    5  0.0
2    2  0.0
3   -4 -4.0
4   -6 -8.5
5   -2 -8.s
6    1 -7.5
7    4 -3.5
8    2 -1.5
9   -3 -4.5
10  -6 -8.5
11  -1 -8.5
12   8 -0.5
13   9  0.0
14   5  0.0
15  -6 -6.0
16 -11 -8.5`

我想將此功能應用於data.frame:

df <- data.frame(x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                   y <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                   z <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11))

使用:

output <- myfunction(df) 

它不起作用,並使用:

outputs <- data.frame(sapply(df, myfunction))

data.frame輸出的格式不正確。 data.frame的每個原始列應為2列。

在這種情況下,您想使用lapply 因為它實際上是等長向量的列表,它將處理data.frame的每一列,並分別返回兩列data.frame。

x <- lapply(df, myfunction)

另外, sapply可以正常工作。 唯一的區別是,一開始它看起來有所不同。 有關所有解決方案之間的差異,請參見print(x)

x <- sapply(df, myfunction)

之后,您可能希望再次將它們從列表組合到data.frame。 您可以使用do.call做到這一點

df2 <- do.call(cbind, x)

這會弄亂列名。 您可以使用names更改它們

names(df2) <- NULL
df2
# 1    5  0.0   5  0.0   5  0.0
# 2    2  0.0   2  0.0   2  0.0
# 3   -4 -4.0  -4 -4.0  -4 -4.0
# 4   -6 -8.5  -6 -8.5  -6 -8.5
# ....

邊注:

如果你沒有一個data.frame而是一個矩陣作為輸入,另一個選擇是apply與用MARGIN = 2

x <- apply(df, MARGIN = 2, myfunction)

盡管在此示例中也可以正常工作,但是在向量中使用不同的數據類型時,您會遇到麻煩,因為它將在應用函數之前將data.frame轉換為矩陣。 因此,不建議這樣做。 有關更多信息,請參見此詳細且易於理解的文章

進一步閱讀:
Hadley Wickham的Advanced R。 還可以在此站點上查閱有關數據類型的部分。
彼得·沃納(Peter Werner)的博客文章


我非常感謝@Gregor在這篇文章上的投入。

暫無
暫無

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

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