【问题标题】:How can I apply a function to every row of a data frame in R when the function requires multiple inputs?当函数需要多个输入时,如何将函数应用于 R 中数据帧的每一行?
【发布时间】:2023-03-24 04:26:01
【问题描述】:

我需要对 R 中数据框每一行的数据运行卡方检验。到目前为止,我有一个可以创建矩阵并在矩阵上运行测试的函数。当我手动将数据输入函数时,这工作正常。

chisquare.table <- function(var1, var2, var3, var4){
  t <- matrix(c(var1, var2, var3, var4), nrow = 2)
  chisq.test(t)

chisquare.table(80, 99920, 85, 99915)

但是,我想做的是将此函数应用于数据框的每一行,使得 var1 是行 x 列 1,var2 是行 x 列 2 , var3 是第 x 行第 3 列,var4 是第 x 行第 4 列。

我用 apply() 函数尝试了几种不同的方法,但我找不到一种可以让我以我想要的方式从行中获取数据的方法。我真的很感谢任何帮助或建议,因为我在网上没有找到太多关于使用 apply() 和多个输入的信息。

【问题讨论】:

  • 请显示数据框输入的样本,并显示您期望的输出。
  • 您应该考虑使用mapply,而不是建议使用apply。在这种情况下,需要重新设计函数以使用这些控制策略中的任何一个,但mapply 是两者中更宽容的一个。新的 R 用户经常被强制转换为矩阵对象而绊倒,矩阵对象反过来又将因子转换为整数,如果参数列表中有单个字符对象,则将整个结果转换为字符。

标签: r


【解决方案1】:

如果我们在每一行上应用该函数,请使用apply。此外,不要将行元素一一指定为参数(因为每个数据集可能不同),而是使用可以将任意数量的元素作为参数的...,并从中创建matrix

chisquare.tableMod <- function(...){

     t <- matrix(c(...), nrow = 2) 
      chisq.test(t)

   }

out <- apply(df1, 1, chisquare.tableMod)

使用 OP 函数的输出进行测试

chisquare.table <- function(var1, var2, var3, var4){
     t <- matrix(c(var1, var2, var3, var4), nrow = 2)


     chisq.test(t)
  }

outOld <- chisquare.table(80, 99920, 85, 99915)
identical(out[[1]], outOld)
#[1] TRUE

正如@42- 在 cmets 中提到的,apply 返回一个matrix,并且矩阵只能容纳单个类。因此,在使用 apply 时仅选择那些为 numeric 的列(或仅选择单个类)

数据

df1 <- data.frame(v1 = c(80, 79, 49), v2 = c(99920, 98230, 43240),
      v3  = c(85, 40, 35), v4 = c(99915, 43265, 43238))

【讨论】:

  • 我认为您应该将apply 的可取目标缩小到仅那些完全是数字的目标。使用 apply 代替 for-loop 逻辑是初学者困惑的常见来源。
  • 这很好用。谢谢你。我想我会永远用谷歌搜索这个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多