在R中为数据框的每一行应用自定义函数

6

我想把数据框中的每一行作为输入传递给函数,对数据进行处理,然后将输出写入到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)) 进行操作。 - Tensibai
这肯定是一个XY问题(什么是XY问题?)。听起来你正在尝试使用逻辑索引,使用复合索引/多索引来索引非常大的DB文件。或者你可以使用哈希。你能否提供更多上下文重新陈述你的问题?这些项的大小是多少? - smci
是的,你可能是正确的,这看起来像一个 XY 问题,对此我感到抱歉。我已经编辑了我的原始帖子,包括我想要做什么。 - Stephen Saidani
我想基于我的数据中的变量组合来对一个大型(Gb?)数据文件进行子集处理,并将结果存储在新的数据文件中。这似乎非常像是通过多索引访问巨大的磁盘支持的数据库文件以获取视图。可以考虑使用HDFS、R bigmemory和ff等工具。 - smci
谢谢。不,它的大小不是以GB为单位的。我这样做的原因是因为视图的可能性数量很多。如果足够大,我会使用HDFS。如果我处理更大的日期范围,Hadoop/HDFS可能是我要使用的解决方案。但是现在我已经找到了一个可行的解决方案。感谢您的帮助。 - Stephen Saidani
2个回答

4
我认为将一行作为参数传递给您的函数会更容易。
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,使其接受一个文件名参数。
或者在myfunction中将write.csvappend = TRUE作为参数放置,以将所有内容写入同一文件(但请注意,代码的连续运行将不会覆盖该文件-您可以在write.csv(...,append = TRUE)之前加入 if(file.exists("mycsvfile.csv"))file.remove("mycsvfile.csv"))。

谢谢,这部分已经起作用了,但只保存数据框中的最后一行文件。 - Stephen Saidani
更新应该会有所帮助。那个问题需要你更改函数。 - CJB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接