当前位置: 首页 > 知识库问答 >
问题:

当函数需要多个输入时,如何将函数应用于R中数据帧的每一行?

傅自明
2023-03-14

我需要对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。

我已经尝试了几种不同的应用程序()函数的方法,但是我找不到一种允许我按照我想要的方式从行中获取数据的方法。我真的很感激这方面的任何帮助或建议,因为我在网上没有找到太多关于使用具有多个输入的应用程序()的信息。

共有1个答案

琴俊良
2023-03-14

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

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-在评论中提到的,application返回一个矩阵并且矩阵只能容纳单个类。因此,在使用application时,仅选择那些数字的列(或仅单个类)

df1 <- data.frame(v1 = c(80, 79, 49), v2 = c(99920, 98230, 43240),
      v3  = c(85, 40, 35), v4 = c(99915, 43265, 43238))
 类似资料:
  • 我必须从二维坐标计算希尔伯特曲线上的距离。使用hilbertcurve包,我构建了自己的“hilbert”函数。坐标存储在数据帧(列1和列2)中。如您所见,我的函数在应用于两个值(test)时有效。 然而,它只是不工作时,应用行明智通过应用函数!这是为什么呢?我到底做错了什么?我需要一个额外的列“希尔伯特”,希尔伯特距离在列“col_1”和“col_2”中给出。 最后一个命令以错误结束: 谢谢你的

  • 我想继续将此函数应用于我的所有数据页,例如。df1,df2,df3...DF100。输出文件应保持相同的dataframe类型和名称。 lapply函数不起作用,因为它返回一个列表,而不是单独的数据帧。

  • 我经常处理格式不好的数据(即数字字段不一致等) 可能还有其他方法,我不知道,但我格式化数据帧中单个列的方法是使用函数并将该列映射到该函数。 问题:1-如果我有一个包含50列的数据框,并且想要将该格式应用于多个列,等等列1, 3, 5, 7, 9, 你能去吗 ...这样我可以格式化所有的数字列在一行?

  • 怎么办? **添加详细示例如下***

  • 并将其应用于数据表的一列--这是我希望这样做的: 我还没有找到任何简单的方法,正在努力找出如何做到这一点。一定有一个更简单的方法,比将数据rame转换为和RDD,然后从RDD中选择行来获得正确的字段,并将函数映射到所有的值,是吗?创建一个SQL表,然后用一个sparkSQL UDF来完成这个任务,这更简洁吗?

  • 我从这个URL刮取了这个表: "https://www.patriotsoftware.com/blog/accounting/average-cost-living-by-state/" 看起来像这样: 然后我编写了这个函数来帮助我将字符串转换成整数: 当我只将函数应用于一列时,它就会工作。我在这里找到了关于在多个列上使用的答案:如何将函数应用于多个列 但我下面的代码不起作用,也不会产生错误: