根据数据帧子集以及数据帧列将函数传递给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