R根据函数向数据集添加列

时间:2015-06-17 00:32:50

标签: r

我有一个数据集,我想根据其他一些列插入一个新列。

我这样做了:

addGoodnessCustomerClass <- function(Amount, Age){
  if((Amount > 90)&& (Age > 23) && (Age < 44))
    return (c("VIP"))
  return (c("BAD"))
}

cbind(cards, lapply(X = cards, FUN = addGoodnessCustomerClass(cards$Amount, cards$Age)))

我收到错误消息:

Error in get(as.character(FUN), mode="function", envir = envir):
object 'BAD' of mode 'function' was not found

请帮助

3 个答案:

答案 0 :(得分:2)

您可以在行模式下使用apply()功能(第二个参数设置为1):

addGoodnessCustomerClass <- function(Amount, Age) {
    if ((Amount > 90)&& (Age > 23) && (Age < 44))
        return ("VIP")
    return ("BAD")
}

old.num.cols <- ncol(cards)   # remember number of columns before cbind
cbind(cards, apply(cards[,c('Amount','Age')],
                   1,
                   function(y) addGoodnessCustomerClass(y['Amount'],y['Age'])))

要命名新列,您可以像这样明确地设置它:

colnames(cards)[old.num.cols+1] <- "CustomerClass"

答案 1 :(得分:2)

我认为你并不需要一个“功能”,而是一个确定新列的测试。您可以通过ifelse电话执行此操作。怎么样:

cbind.data.frame(cards, AccountClass=cases("VIP"=cards$Amount > 90 & cards$Age > 23 & cards$Age < 44, "OKAY"=cards$Amount > 50 & cards$Age>30, "BAD"=TRUE)

注意cbind.data.frame作为cbind将返回一个矩阵,我猜你不想要。

答案 2 :(得分:0)

我相信您的错误的根源如下(来自lapply帮助页面):

  

函数FUN必须能够接受X的任何元素作为输入。如果后者是原子向量,则FUN将始终传递与X相同类型的长度为一的向量。

当您在数据框上调用lapply()时,您要求R将一些函数应用于数据框的每一列(当然这不是您的目标)。

一般来说,要对多列进行操作,您需要使用apply,它可以在数组上工作(不仅仅是列表)