【问题标题】:Applying custom functions to each row in a dataframe in r将自定义函数应用于 r 中数据框中的每一行
【发布时间】:2015-12-05 03:26:45
【问题描述】:

我正在尝试使用数据框中的每一行作为函数的输入来处理一些数据,然后将输出写入 csv 文件。按照下面的例子

myfunction <- function(X, Y, Z){

                       data <- read.csv("mydata.csv")
                       subsetedData <- subset(data, x=X & y=Y & z=Z, select=x:z)
                       write.csv(subsetedData, file="mycsvfile.csv")
                       }

apply(myXYZdata, MARGIN = 1, function(x1, x2, x3) myfunction(X, Y, Z))

我想根据数据框 myXYZdata 中的每一行进行子集化。但是,这似乎不起作用,或者我不完全理解 apply 的正确用法。

我知道这可以使用循环来完成,但我不想那样做。

编辑:

这样做的目的是我有一个大数据文件,我想根据在我的数据框“myXYZdata”中找到的变量组合对其进行子集化,并将结果存储在新的数据文件中。

我要子集的大数据文件是格式。

date                      x   y  z    count          
1 2015-08-20 00:00:00.000 a   d  h    56
2 2015-08-26 00:00:00.000 b   e  h     4
3 2015-08-18 00:00:00.000 b   f  i     8
4 2015-09-03 00:00:00.000 c   e  l     32
5 2015-08-12 00:00:00.000 a   g  l     3

【问题讨论】:

  • apply(myXYZdata, MARGIN = 1, function(x) myfunction(x$X, x$Y, x$Z)) 应该可以。
  • 这肯定是XY problem (What is an XY problem?)。听起来您正在尝试使用复合索引/多索引索引到一个非常大的数据库文件,并使用逻辑索引。或者你可以使用哈希。你能用更多的背景重申你的问题吗?这些物品的尺寸是多少?
  • 是的,您可能是正确的,这看起来确实是 XY 问题,对此感到抱歉。我已经编辑了我的原始帖子以包含我想要做的事情。
  • “我想根据在我的数据中找到的变量组合对一个大型 (Gb?) 数据文件进行子集化,并将结果存储在新的数据文件中。” 这真的闻起来像多索引到一个巨大的磁盘支持的数据库文件以获取视图。查看 HDFS、R bigmemory 与 ff 等。

标签: r


【解决方案1】:

我相信将一行作为参数传递给您的函数更容易。

myfunction <- function(row){

                   data <- read.csv("mydata.csv")
                   subsetedData <- subset(data, x=row[1] & y=row[2] & z=row[3], select=x:z)
                   write.csv(subsetedData, file="mycsvfile.csv")
                   }

apply(myXYZdata[,c("X","Y","Z")], MARGIN = 1, myfunction)

【讨论】:

    【解决方案2】:

    如何使用mapply(多变量适用):

    mapply(myfunction, myXYZdata$X, myXYZdata$Y, myXYZdata$Z, fnms)
    

    您需要创建一个文件名向量 (fnms),以便将每个条目写入不同的文件,然后更改 myfunction 以便它接受文件名的参数。

    或者将append = TRUE 作为write.csv 的参数放在myfunction 中以将其全部写入同一个文件(但请注意,代码的连续运行不会覆盖文件 - 您可以在@987654328 之前@ 和if(file.exists("mycsvfile.csv")) file.remove("mycsvfile.csv"))。

    【讨论】:

    • 谢谢,这部分工作,但只是保存数据框中最后一行的文件。
    • 更新应该会有所帮助。这个问题需要你改变你的功能。
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 2021-08-03
    • 2013-06-28
    • 2023-03-17
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多