对dataframe运行apply()时,“二元运算符的非数值参数”

velaa5lx  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(80)

我有一个像下面这样的 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

您能分享一下您对这个问题的了解吗?非常感谢。

pbgvytdp

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

tf |>
  mutate(outcome = case_when(
    type == "power" ~ x^coef_ind,
    type == "expo" ~ 1- exp(- coef_ind*x)
  ))

# Output
  x coef_ind  type   outcome
1 1      0.5 power 1.0000000
2 2      0.6 power 1.5157166
3 3      1.0  expo 0.9502129
4 4      2.0  expo 0.9996645

字符串

1rhkuytd

1rhkuytd2#

由于apply转换为矩阵,因此每个值都需要具有相同的类型。如果存在字符串或字符列,则所有内容都转换为字符串。您仍然可以通过强制将数值恢复为数字来使用您的函数。

cal <- function(df){
  
  x = as.numeric(df['x'])
  type = df['type']
  coef = as.numeric(df['coef_ind'])
  
  if(type == "power"){
    outcome = x^coef
  }
  
  if(type == "expo"){
    outcome = 1- exp(- coef*x)
  }
  return(outcome)
}
apply(tf, 1, cal)
[1] 1.0000000 1.5157166 0.9502129 0.9996645
cgfeq70w

cgfeq70w3#

由于您的操作可以在整个列上运行(即原子向量),因此可以考虑使用嵌套的ifelse对流程进行向量化。向量化比使用forapply跨行或跨列循环的迭代更有效。对于基R,考虑within在 Dataframe 上下文中有条件地添加新的 outcome 列。

df <- within(
  df, {
      outcome <- ifelse(
          type == "power", x^coeff, ifelse(
              type == "expo", 1- exp(- coef*x), NA
          )
      )       
  }
)

字符串

相关问题