我有一个像下面这样的 Dataframe :
x <- c(1,2,3,4)
coef_ind <- c(0.5,0.6,1,2)
type <- c("power","power","expo","expo")
tf <- data.frame(x=x,coef_ind=coef_ind,type=type)
> tf
x coef_ind type
1 1 0.5 power
2 2 0.6 power
3 3 1.0 expo
4 4 2.0 expo
字符串
我写了一个如下的函数:
cal <- function(df){
x = df['x']
type = df['type']
coef = df['coef_ind']
if(type == "power"){
outcome = x^coef
}
if(type == "expo"){
outcome = 1- exp(- coef*x)
}
return(outcome)
}
型
现在,我想将该函数应用于表中的每一行。因此:
apply(tf,1,cal)
型
但是,我得到了错误提示
Error in x^coef : non-numeric argument to binary operator
enter code here
您能分享一下您对这个问题的了解吗?非常感谢。
3条答案
按热度按时间pbgvytdp1#
问题是,引用Mr. Flick's answer from 2014:
apply
不直接处理 Dataframe ;它适用于矩阵,对于矩阵,所有元素必须是相同的原子类型。如果传入一个data.frame,apply()
将把它强制转换成一个矩阵。由于字符值不能存储在更“简单”的数据类型中,所以 * 所有内容都转换为字符值 *。所以问题是,对于第一行,例如,你的函数没有得到参数
c(1, 0.5, "power")
,它得到了c("1", "0.5", "power"
,这在outcome = x^coef
行失败,因为前两个参数不再是数字-它们是字符串。一个简单的替代方法是使用
dplyr
:字符串
1rhkuytd2#
由于
apply
转换为矩阵,因此每个值都需要具有相同的类型。如果存在字符串或字符列,则所有内容都转换为字符串。您仍然可以通过强制将数值恢复为数字来使用您的函数。cgfeq70w3#
由于您的操作可以在整个列上运行(即原子向量),因此可以考虑使用嵌套的
ifelse
对流程进行向量化。向量化比使用for
或apply
跨行或跨列循环的迭代更有效。对于基R,考虑within
在 Dataframe 上下文中有条件地添加新的 outcome 列。字符串