我正在尝试创建一个可重用的函数来计算应用于数据帧的转换,并根据其他变量的一些条件返回值(或NA)。这是我第一次尝试在函数中创建多条件计算。
首先会看一个名为parentID的var,它是一个分类var。只有值377的计算方式不同。然后它将查看两个vars引导和点击的值,以检查它们是否具有大于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)
我会假设看到控制台中打印的值,但这已经抛出了许多错误,并且在搜索和检查我无法调试的多个资源之后。从这里我将使用它在数据框中创建一个x $ 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
如果有更好的方式来分享这个数据示例,请告诉我,我可以编辑它。我记得一个软件包但无法在rseek中找到它,也无法在可重用的数据集中找到它。
提前致谢。
答案 0 :(得分:2)
apply
在数据框上使用时会将其转换为矩阵。如果您的数据框包含字符或因子变量,那么结果将是一个字符矩阵,您的代码将失败。
但是,在这种情况下,您不需要apply
。您可以使用嵌套的ifelse
s:
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
代码块中输入了拼写错误。)
答案 1 :(得分:0)
尝试使用
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)
}