-1

假设我有以下类型的数据:

df <- data.frame(student = c("S1", "S2", "S3", "S4", "S5", "S2", "S6", "S1", "S7", "S8"), 
              factor = c("A", "A", "A", "A", "A", "B", "B", "C", "C", "D"), 
              year =  c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2), 
              count1 = c(0, 1, 0, 0, 0, 1, 0, 0, 0, 0), 
              count2 = c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0))

我需要一种比典型的 apply() 函数更有效的方法来分析给定年份中学生和班级的两列。当学生在给定年份保持相同的因子水平时,该函数返回计数为零。当学生在给定年份中处于多个因子级别时,计数会针对该学生在单独因子级别中的每个实例更新 i+1。

我想要一个单独的计数/功能来分析多年来数据集中的学生。例如,跨年保持相同因子水平的学生获得的计数为零。如果发现学生在不同年份具有不同的因子水平,则每个实例的计数都会更新 i+1。

有超过 10k 的观察结果,所以我对 *apply 的尝试是徒劳的。也就是说,我已经能够计算每个学生和因素的唯一实例,但只有第一个唯一实例,而不是学生(唯一 ID)和因素的所有唯一实例。个人可以在几年内或跨年重复。

理想的输出如下:

Student1,Factor.Count(年内),Factor.Count(年间)

4

1 回答 1

0

这里有一个命令链可以让你到达那里,使用因子交互来查找同一年学生的因子变化:

# Add up the occurrences of a student having multiple factors in the same year,
# for each year
in.each.year <- aggregate(factor~student:year, data=df, FUN=function(x) length(x)-1)[c(1,3)]

# Total these up, for each student
in.year <- aggregate(factor~student, data=in.each.year, FUN=sum)

# The name was "factor".  Set it to the desired name.
names(in.year)[2] <- 'count1'

# Find the occurrences of a student having multiple factors
both <- aggregate(factor~student, data=df, FUN=function(x) length(x)-1)
names(both)[2] <- 'both'

# Combine with 'merge'
m <- merge(in.year, both)

# Subtract to find "count2"
m$count2 <- m$both - m$count1
m$both <- NULL

m
##   student count1 count2
## 1      S1      0      1
## 2      S2      1      0
## 3      S3      0      0
## 4      S4      0      0
## 5      S5      0      0
## 6      S6      0      0
## 7      S7      0      0
## 8      S8      0      0

这可以与您的原始数据框合并(没有列count1count2):

merge(df, m)
##    student factor year count1 count2
## 1       S1      A    1      0      1
## 2       S1      C    2      0      1
## 3       S2      A    1      1      0
## 4       S2      B    1      1      0
## 5       S3      A    1      0      0
## 6       S4      A    1      0      0
## 7       S5      A    1      0      0
## 8       S6      B    1      0      0
## 9       S7      C    2      0      0
## 10      S8      D    2      0      0
于 2013-04-26T03:00:54.393 回答