簡體   English   中英

將條件函數應用於數據框

[英]Apply conditional function to a dataframe

我想將一個函數應用於數據幀的行。 該函數的條件是一列的值大於另一列中的值。 如果滿足條件,我從兩個(其他)列中取出元素並將它們相乘,然后將結果添加到新列中。 如果不滿足初始條件,則不存在乘法,並將原始值復制到新列。

創建一些數據:

var0 <- c("A", "B", "C", "D", "E")
var1 <- rep(c(105,200), each = 5)
var2 <- c(110:114, 25:29)
var3 <- rep(c(560,135), each = 5)
var4 <- rep(c(0.5,0.2), each = 5)
my_df <- as.data.frame(cbind(var0, var1, var2, var3, var4))    

看看數據:

       var0 var1 var2 var3 var4
    1     A  105  110  560  0.5
    2     B  105  111  560  0.5
    3     C  105  112  560  0.5
    4     D  105  113  560  0.5
    5     E  105  114  560  0.5
    6     A  200   25  135  0.2
    7     B  200   26  135  0.2
    8     C  200   27  135  0.2
    9     D  200   28  135  0.2
    10    E  200   29  135  0.2

我嘗試編寫代碼:

apply(my_df, 1, function(x) {
  if(x$var3 > x$var1) {
    x$output <- x$var2 * x$var4
    } else {
      x$output <- x$var2
    }
      return(x)
  })

結果應該是什么樣子:

        var0 var1 var2 var3 var4 output
    1     A  105  110  560  0.5   55.0
    2     B  105  111  560  0.5   55.5
    3     C  105  112  560  0.5   56.0
    4     D  105  113  560  0.5   56.5
    5     E  105  114  560  0.5   57.0
    6     A  200   25  135  0.2   25.0
    7     B  200   26  135  0.2   26.0
    8     C  200   27  135  0.2   27.0
    9     D  200   28  135  0.2   28.0
    10    E  200   29  135  0.2   29.0

由於var3在前5行中大於var1,因此var2 * var4出現,在最后5行中不滿足條件,因此var2只是復制到輸出列。

你不需要在這里使用apply()函數,你可以使用ifelse()

df$output <- ifelse(df$var3 > df$var1, df$var2*df$var4, df$var2)
var0 <- c("A", "B", "C", "D", "E")
var1 <- rep(c(105,200), each = 5)
var2 <- c(110:114, 25:29)
var3 <- rep(560,135, 5)
var4 <- rep(c(0.5,0.2), each = 5)

避免數字轉換為我正在使用cbind.data.frame而不是cbind的as.data.frame的因素

my_df <-cbind.data.frame(var0, var1, var2, var3, var4)

> str(my_df)
'data.frame':   10 obs. of  5 variables:
 $ var0: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 1 2 3 4 5
 $ var1: num  105 105 105 105 105 200 200 200 200 200
 $ var2: int  110 111 112 113 114 25 26 27 28 29
 $ var3: num  560 560 560 560 560 560 560 560 560 560
 $ var4: num  0.5 0.5 0.5 0.5 0.5 0.2 0.2 0.2 0.2 0.2

然后我使用ifelse條件來獲取新列

>my_df$output=ifelse(my_df$var3>my_df$var1,my_df$var2*my_df$var4,my_df$var2)
> my_df
   var0 var1 var2 var3 var4 output
1     A  105  110  560  0.5   55.0
2     B  105  111  560  0.5   55.5
3     C  105  112  560  0.5   56.0
4     D  105  113  560  0.5   56.5
5     E  105  114  560  0.5   57.0
6     A  200   25  560  0.2    5.0
7     B  200   26  560  0.2    5.2
8     C  200   27  560  0.2    5.4
9     D  200   28  560  0.2    5.6
10    E  200   29  560  0.2    5.8

注意我在var3中沒有得到與你相同的值。 所以我把var3變成了給定的

> var3 <- c(rep(560,5),rep(135,5))

> var3
 [1] 560 560 560 560 560 135 135 135 135 135
>  my_df <-cbind.data.frame(var0, var1, var2, var3, var4)
>  my_df$output=ifelse(my_df$var3>my_df$var1,my_df$var2*my_df$var4,my_df$var2)
> my_df
   var0 var1 var2 var3 var4 output
1     A  105  110  560  0.5   55.0
2     B  105  111  560  0.5   55.5
3     C  105  112  560  0.5   56.0
4     D  105  113  560  0.5   56.5
5     E  105  114  560  0.5   57.0
6     A  200   25  135  0.2   25.0
7     B  200   26  135  0.2   26.0
8     C  200   27  135  0.2   27.0
9     D  200   28  135  0.2   28.0
10    E  200   29  135  0.2   29.0

暫無
暫無

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

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