簡體   English   中英

使用應用於R中數據幀的函數計算變量

[英]Calculate variable with a function that is applied to a data frame in R

我試圖創建一個可重用的函數來計算轉換,該轉換將應用於數據幀並根據其他變量的一些條件返回值(或NA)。 這是我在函數中創建多條件計算的首次嘗試。

首先將查看一個名為parentID的變量,它是一個分類變量。 僅值377將被不同地計算。 然后它將查看兩個vars Leads的值,並單擊以檢查它們的值是否大於1。否則返回NA。 然后,它將確定潛在客戶或銷售額是否更大,並根據哪個更大。

計算很簡單:x $ sales / x $ clicks或x $ leads / x $ clicks

set_cr <- function(x) {
  if (x$parentID==377) {
    if (x$leads < 1 | x$clicks < 1) {
      return(NA)
    }
    else {
      if (x$leads > x$sales) {
      cr <- x$leads / x$clicks
      return(cr)
      }
      else {
        cr <- x$sales / x$clicks
        return(cr)
      }
    }
  }
  else {
    if (x$parentID != 377) {
      if (x$sales < 1 | x$clicks < 1) {
        return(NA)
      }
      else {
        cr <- x$sales / x$clicks
        return(cr)
      }
    }
  }

  return(NA)
}

然后,我使用以下方法將其應用於數據框:

apply(df, 1, set_cr)

我本來希望看到控制台中打印的值,但是這已經引發了許多錯誤,並且在搜索並檢查了多個資源之后,我無法進行調試。 從這里開始,我將使用它在數據框中創建ax $ cr var。

此問題的樣本數據集:

structure(list(parentID = c(377, 377, 311, 322, 333), clicks = c(9078, 
78404, 398443, 16142, 111715), sales = c(69, 95, 7191, 146, 33966
), leads = c(500, 0, 500, 0, 33966)), .Names = c("parentID", "clicks", 
"sales", "leads"), row.names = c(NA, 5L), class = "data.frame")

parentID clicks sales leads
     377   9078    69   500
     377  78404    95     0
     311 398443  7191   500
     322  16142   146     0
     333 111715 33966 33966

如果有更好的方法共享此數據示例,請告訴我,我可以對其進行編輯。 我記得一個程序包,但是找不到可重復使用的數據集的地方。

提前致謝。

apply ,當用於數據幀時,將其轉換為矩陣。 如果您的數據框包含字符或因子變量,則結果將是字符矩陣,並且代碼將失敗。

但是,在這種情況下,您不需要apply 您可以使用嵌套的ifelse s對代碼進行向ifelse

set_cr <- function(x) 
{
    ifelse(x$parentID == 377,
    ifelse(x$leads < 1 || x$clicks < 1, NA, x$leads / x$clicks),
    ifelse(x$sales < 1 || x$clicks < 1, NA, x$sales / x$clicks))
}

set_cr(df)

(我假設您在第二個else代碼塊中輸入了錯字。)

嘗試使用

x['var'] instead of x$var

您的功能應該可以工作。

set_cr <- function(x) {
  if (x['parentID']==377) {
if (x['leads'] < 1 || x['clicks'] < 1) {
  return(NA)
}
else {
  if (x['leads'] > x['sales']) {
  cr <- x['leads'] / x['clicks']
  return(cr)
  }
  else {
    cr <- x['sales'] / x['clicks']
    return(cr)
  }
 }
}
 else {
if (x['parentID'] != 377) {
  if (x['sales'] < 1 || x['clicks'] < 1) {
    return(NA)
  }
  else {
    cr <- x['sales'] / x['clicks']
    return(cr)
  }
}
 }
return(NA)
}

暫無
暫無

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

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