gpt4 book ai didi

r - 尝试使用用户定义的函数来填充数据框中的新列。出了什么问题?

转载 作者:行者123 更新时间:2023-12-01 11:55:19 24 4
gpt4 key购买 nike

超短版本:我正在尝试使用用户定义的函数通过以下命令在数据框中填充新列:

TestDF$ELN<-EmployeeLocationNumber(TestDF$Location)

但是,当我运行该命令时,它似乎只是将 EmployeeLocationNumber 应用于 Location 的第一行值,而不是使用每一行的值来单独确定该行的新列值。

请注意:我试图理解 R,而不仅仅是执行此特定任务。我实际上能够使用 Apply() 函数获得我正在寻找的输出,但这无关紧要。我的理解是上面的行应该逐行工作,但事实并非如此。

以下是测试的细节:

TestDF<-data.frame(Employee=c(1,1,1,1,2,2,3,3,3), 
Month=c(1,5,6,11,4,10,1,5,10),
Location=c(1,5,6,7,10,3,4,2,8))

此 testDF 跟踪 3 名员工中的每一个在一年中在多个地点的位置。

(您可以认为“位置”对于每个员工都是唯一的……它实际上是该行的唯一 ID。)

EmployeeLocationNumber 函数获取一个位置并输出一个数字,指示员工访问该位置的顺序。例如EmployeeLocationNumber(8) = 2因为这是访问它的员工访问的第二个位置。

EmployeeLocationNumber <- function(Site){
CurrentEmployee <- subset(TestDF,Location==Site,select=Employee, drop = TRUE)[[1]]
LocationDate<- subset(TestDF,Location==Site,select=Month, drop = TRUE)[[1]]
LocationNumber <- length(subset(TestDF,Employee==CurrentEmployee & Month<=LocationDate,select=Month)[[1]])
return(LocationNumber)
}

我意识到我可能可以将所有这些打包到一个子集命令中,但是我不知道当您在其他子集命令中使用子集命令时引用是如何工作的。

所以,请记住,我真的想了解如何在 R 中工作,我有几个问题:

  1. 为什么不会 TestDF$ELN<-EmployeeLocationNumber(TestDF$Location)像其他赋值语句一样逐行工作?

  2. 有没有一种更简单的方法可以根据另一个数据框中的值来引用数据框中的特定值?也许一个不返回然后必须展平并从中提取的数据框/列表?

  3. 我确定我正在使用的函数可笑地不像 R...我应该怎么做才能从本质上模拟 INNER Join 类型的查询?

最佳答案

使用逻辑索引,您的函数的精简单行替换为:

EmployeeLocationNumber <- function(Site){
with(TestDF[do.call(order, TestDF), ], which(Location[Employee==Employee[which(Location==Site)]] == Site))
}

当然,这不是最易读的方式,但它演示了逻辑索引和 R 中的 which() 的原理。然后,就像其他人所说的那样,只需将其用矢量化包装起来*ply 函数将其应用于您的数据集。

关于r - 尝试使用用户定义的函数来填充数据框中的新列。出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com