根据 R 中的其他列插入一列类别
inserting a column of categories based on other columns in R
我的数据框目前看起来像这样:
Tree Cookie Age
C1T1 A 10
C1T1 A 20
C1T1 A 30
C1T1 B 15
C1T1 B 20
C1T1 B 25
C1T2 A 12
C1T2 A 20
C1T2 B 5
C1T2 B 13
因此,对于每棵“树”,我都有几个“Cookie”,并且对于每个 cookie,我都有不同的年龄(基本上代表树生命的不同部分)。我想添加另一列,按最大年龄对每棵树进行分箱 - 最古老的 cookie 的最老年龄,在这种情况下,它将是两棵树中 cookie A 的最后年龄(因此如果将树分类为“年轻”最大年龄 < 40,如果最大年龄 > 40 且 < 120,则为“中年”,如果最大年龄 > 120,则为“老年”)。非常感谢对此的任何建议!
好的,开始了:
我使用 dplyr
库来执行此操作,它为我提供了 %>%
运算符和 summarise()
函数。我还将您的数据框命名为 trees
。那么:
library(dplyr)
trees2 <- trees %>%
group_by(Tree = Tree) %>%
summarise(Age = max(Age))
trees2$Cat <- ifelse(trees2$Age < 40, "young", ifelse(trees2$Age > 120, "old", "mid-age"))
trees$Category = trees2$Cat[match(trees$Tree, trees2$Tree)]
以前,trees2
会这样:
> trees2
# A tibble: 2 x 2
Tree Age
<chr> <chr>
1 C1T1 30
2 C1T2 5
> trees2$Cat <- ifelse(trees2$Age < 40, "young", ifelse(trees2$Age > 120, "old", "mid-age"))
> trees2
# A tibble: 2 x 3
Tree Age Cat
<chr> <chr> <chr>
1 C1T1 30 young
2 C1T2 5 old
之后,使用 cory 在 this post 中的建议,我将这个小标题放在原来的 table 中,最后一行:
trees$Category = trees2$Cat[match(trees$Tree, trees2$Tree)]
这给了我:
> trees
Tree Cookie Age Category
1 C1T1 A 10 young
2 C1T1 A 20 young
3 C1T1 A 30 young
4 C1T1 B 15 young
5 C1T1 B 20 young
6 C1T1 B 25 young
7 C1T2 A 12 old
8 C1T2 A 20 old
9 C1T2 B 5 old
10 C1T2 B 13 old
使用cut
的方法:
trees_max <- trees %>%
group_by(Tree) %>%
summarise(max_age = max(Age))
breaks <- c(0, 40, 120, Inf)
labels <- c("young", "mid-age", "old")
trees_max$cat <- cut(trees_max$max_age, breaks, labels)
给你
> trees_max
# A tibble: 4 x 3
Tree max_age cat
<chr> <dbl> <fct>
1 C1T1 30 young
2 C1T2 20 young
3 C1T3 35 young
4 C1T4 77 mid-age
我的数据框目前看起来像这样:
Tree Cookie Age
C1T1 A 10
C1T1 A 20
C1T1 A 30
C1T1 B 15
C1T1 B 20
C1T1 B 25
C1T2 A 12
C1T2 A 20
C1T2 B 5
C1T2 B 13
因此,对于每棵“树”,我都有几个“Cookie”,并且对于每个 cookie,我都有不同的年龄(基本上代表树生命的不同部分)。我想添加另一列,按最大年龄对每棵树进行分箱 - 最古老的 cookie 的最老年龄,在这种情况下,它将是两棵树中 cookie A 的最后年龄(因此如果将树分类为“年轻”最大年龄 < 40,如果最大年龄 > 40 且 < 120,则为“中年”,如果最大年龄 > 120,则为“老年”)。非常感谢对此的任何建议!
好的,开始了:
我使用 dplyr
库来执行此操作,它为我提供了 %>%
运算符和 summarise()
函数。我还将您的数据框命名为 trees
。那么:
library(dplyr)
trees2 <- trees %>%
group_by(Tree = Tree) %>%
summarise(Age = max(Age))
trees2$Cat <- ifelse(trees2$Age < 40, "young", ifelse(trees2$Age > 120, "old", "mid-age"))
trees$Category = trees2$Cat[match(trees$Tree, trees2$Tree)]
以前,trees2
会这样:
> trees2
# A tibble: 2 x 2
Tree Age
<chr> <chr>
1 C1T1 30
2 C1T2 5
> trees2$Cat <- ifelse(trees2$Age < 40, "young", ifelse(trees2$Age > 120, "old", "mid-age"))
> trees2
# A tibble: 2 x 3
Tree Age Cat
<chr> <chr> <chr>
1 C1T1 30 young
2 C1T2 5 old
之后,使用 cory 在 this post 中的建议,我将这个小标题放在原来的 table 中,最后一行:
trees$Category = trees2$Cat[match(trees$Tree, trees2$Tree)]
这给了我:
> trees
Tree Cookie Age Category
1 C1T1 A 10 young
2 C1T1 A 20 young
3 C1T1 A 30 young
4 C1T1 B 15 young
5 C1T1 B 20 young
6 C1T1 B 25 young
7 C1T2 A 12 old
8 C1T2 A 20 old
9 C1T2 B 5 old
10 C1T2 B 13 old
使用cut
的方法:
trees_max <- trees %>%
group_by(Tree) %>%
summarise(max_age = max(Age))
breaks <- c(0, 40, 120, Inf)
labels <- c("young", "mid-age", "old")
trees_max$cat <- cut(trees_max$max_age, breaks, labels)
给你
> trees_max
# A tibble: 4 x 3
Tree max_age cat
<chr> <dbl> <fct>
1 C1T1 30 young
2 C1T2 20 young
3 C1T3 35 young
4 C1T4 77 mid-age