根据数据帧子集以及数据帧列将函数传递给sapply in R 请考虑以下数据帧 #build sample data.frame theData <- data.frame(surname = c("Smith","Parker", "Allen", "McGraw", "Parker", "Smith", "Smith"), FamilySize = c(3, 2, 1, 1, 2, 3, 3))
如果我调用这个函数,如下所示根据数据帧子集以及数据帧列将函数传递给sapply in R 请考虑以下数据帧 #build sample data.frame theData <- data.frame(surname = c("Smith","Parker", "Allen", "McGraw", "Parker", "Smith", "Smith"), FamilySize = c(3, 2, 1, 1, 2, 3, 3)),r,R,如果我调用这个函数,如下所示 familyKount(theData, theData$surname[1], theData$FamilySize[1]) 我得到了正确的答案:“3Smith” 但是,我希望将此函数应用于整个数据帧,而不必为姓氏和家庭化指定索引(我不希望对循环使用)。我已经尝试了apply函数系列的各种变体,但我还没有弄清楚如何在这种情况下将整个数据帧以及其中的特定列作为函数的参数进行传递 干杯有很多解决方法。例如,您可以使用表: table(theData$surname)
familyKount(theData, theData$surname[1], theData$FamilySize[1])
我得到了正确的答案:“3Smith”
但是,我希望将此函数应用于整个数据帧,而不必为姓氏
和家庭化
指定索引(我不希望对循环使用)。我已经尝试了apply
函数系列的各种变体,但我还没有弄清楚如何在这种情况下将整个数据帧以及其中的特定列作为函数的参数进行传递
干杯有很多解决方法。例如,您可以使用表:
table(theData$surname)
## Allen McGraw Parker Smith
## 1 1 2 3
或使用dplyr
:
library(dplyr)
group_by(theData, surname) %>%
summarize(SizeCalculated = n()
## Source: local data frame [4 x 2]
##
## surname SizeCalculated
## (fctr) (int)
## 1 Allen 1
## 2 McGraw 1
## 3 Parker 2
## 4 Smith 3)
或使用聚合()
:
您还可以使用sapply()
找到一个可能与您的预期类似的解决方案:
surnames <- unique(theData$surname)
counts <- sapply(surnames, function(s) sum(theData$surname == s))
data.frame(surnames, counts)
## surnames counts
## 1 Smith 3
## 2 Parker 2
## 3 Allen 1
## 4 McGraw 1
aggregate(theData, list(theData$surname), length)
## Group.1 surname FamilySize
## 1 Allen 1 1
## 2 McGraw 1 1
## 3 Parker 2 2
## 4 Smith 3 3
surnames <- unique(theData$surname)
counts <- sapply(surnames, function(s) sum(theData$surname == s))
data.frame(surnames, counts)
## surnames counts
## 1 Smith 3
## 2 Parker 2
## 3 Allen 1
## 4 McGraw 1
tab <- aggregate(theData, list(theData$surname), length)
tab$size_check <- tab$surname == tab$FamilySize
tab
## Group.1 surname FamilySize size_check
## 1 Allen 1 1 TRUE
## 2 McGraw 1 1 TRUE
## 3 Parker 2 2 TRUE
## 4 Smith 3 3 TRUE