我有一个数据集,我想根据其他一些列插入一个新列。
我这样做了:
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
请帮助
答案 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
,它可以在数组上工作(不仅仅是列表)