gpt4 book ai didi

r - 处理 dplyr 中的因子变量

转载 作者:行者123 更新时间:2023-12-02 11:09:40 26 4
gpt4 key购买 nike

我有一个包含事件历史记录的数据帧,我想通过检查每个 ID 号的最后一个事件是否与系统中该 ID 号的当前值匹配来检查其完整性。数据被编码为因素。以下玩具数据框是一个最小的示例:

df <-data.frame(ID=c(1,1,1,1,2,2,2,3,3),
current.grade=as.factor(c("Senior","Senior","Senior","Senior",
"Junior","Junior","Junior",
"Sophomore","Sophomore")),
grade.history=as.factor(c("Freshman","Sophomore","Junior","Senior",
"Freshman","Sophomore","Junior",
"Freshman","Sophomore")))

给出输出

> df
ID current.grade grade.history
1 1 Senior Freshman
2 1 Senior Sophomore
3 1 Senior Junior
4 1 Senior Senior
5 2 Junior Freshman
6 2 Junior Sophomore
7 2 Junior Junior
8 3 Sophomore Freshman
9 3 Sophomore Sophomore
> str(df)
'data.frame': 9 obs. of 3 variables:
$ ID : num 1 1 1 1 2 2 2 3 3
$ current.grade: Factor w/ 3 levels "Junior","Senior",..: 2 2 2 2 1 1 1 3 3
$ grade.history: Factor w/ 4 levels "Freshman","Junior",..: 1 4 2 3 1 4 2 1 4

我想使用 dplyr 提取 grade.history 中的最后一个值,并根据 current.grade 检查它:

df.summary <- df %>%
group_by(ID) %>%
summarize(current.grade.last=last(current.grade),
grade.history.last=last(grade.history))

但是,dplyr 似乎将因子转换为整数,所以我得到了这个:

> df.summary
Source: local data frame [3 x 3]

ID current.grade.last grade.history.last
1 1 2 3
2 2 1 2
3 3 3 4
> str(df.summary)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 3 obs. of 3 variables:
$ ID : num 1 2 3
$ current.grade.last: int 2 1 3
$ grade.history.last: int 3 2 4

请注意,这些值并未对齐,因为原始因子具有不同的水平集。使用 dplyr 执行此操作的正确方法是什么?

我使用的是 R 版本 3.1.1 和 dplyr 版本 0.3.0.2

最佳答案

解决此问题的另一种方法是将因子级别按其自然顺序排列,在本例中为新生、大二、大三、大四,然后使用 which.max 为每个 ID 选择最高值> 索引功能。如果您这样做,则不必担心每个 ID 的列是否按从最低等级到最高等级排序(就像使用 last 函数时所做的那样)。

library(dplyr)

df <-data.frame(ID=c(1,1,1,1,2,2,2,3,3),
current.grade=as.factor(c("Senior","Senior","Senior","Senior",
"Junior","Junior","Junior",
"Sophomore","Sophomore")),
grade.history=as.factor(c("Freshman","Sophomore","Junior","Senior",
"Freshman","Sophomore","Junior",
"Freshman","Sophomore")))


# Ordered vector of grades
gradeLookup = c("Freshman", "Sophomore", "Junior", "Senior")

# Reset the values in the grade columns to the ordering in gradeLookup
df[,-1] = lapply(df[,-1], function(x) {
factor(x, levels=gradeLookup)
})

# For each ID, select the values of current.grade and grade.history at the maximum
# value of grade.history
df %>% group_by(ID) %>%
summarise(current.grade.last = current.grade[which.max(grade.history)],
grade.history.last = grade.history[which.max(grade.history)])

ID current.grade.last grade.history.last
1 1 Senior Senior
2 2 Junior Junior
3 3 Sophomore Sophomore

更新 2:由于您想要按列而不是整行排序和捕获最后一个值(而不是最大值),请尝试以下操作:

df %>% group_by(ID) %>%
summarise(current.grade.last = current.grade[length(grade.history)],
grade.history.last = grade.history[length(grade.history)])

结束更新 2

您的数据是否包含时间变量,例如年份、学期或学年?如果是这样,您可以省略 current.grade 并直接选择最近一年的出勤率 grade.history 的值。这将为您提供每个学生的最后年级水平。例如(假设您的时间变量名为 year):

df %>% group_by(ID) %>%
summarise(last.grade = grade.history[which.max(year)])

更新1:我不确定是什么导致您的代码返回每个级别的数字代码,而不是级别标签。这不仅仅是 last 函数的问题(如果您执行 last(df$grade.history) 就可以看到这一点)。但是,如果您想按时间戳排序然后返回最后一行,下面的代码将保留级别标签。 slice 返回您在 ID 每个值中指定的行。在本例中,我们使用 n() 指定最后一行,它返回每个 ID 值的总行数。

df.summary <- df %>%
group_by(ID) %>%
slice(n())

关于r - 处理 dplyr 中的因子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27879121/

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