r - 带有基于顺序的数字的分类列的前缀标签

标签 r

考虑一个包含两个数字列(xy)和一个包含字符串的分类列(category)的数据框:

d1 <- data.frame(x = c(0, 1, 2, 5, 6.5, 8), y = c(0, 2, 3, 5, 5.5, 5), category = "A")
d2 <- data.frame(x = c(0, 1, 2, 4, 6, 8), y = c(0, 3, 3.5, 4, 4, 5), category = "B")
d3 <- data.frame(x = c(0, 1.5, 3, 4, 6.5, 8), y = c(0, 2.5, 3, 4, 4.5, 5), category = "C")
df <- rbind(d1, d2, d3)
> df
     x   y category
1  0.0 0.0        A
2  1.0 2.0        A
3  2.0 3.0        A
4  5.0 5.0        A
5  6.5 5.5        A
6  8.0 5.0        A
7  0.0 0.0        B
8  1.0 3.0        B
9  2.0 3.5        B
10 4.0 4.0        B
11 6.0 4.0        B
12 8.0 5.0        B
13 0.0 0.0        C
14 1.5 2.5        C
15 3.0 3.0        C
16 4.0 4.0        C
17 6.5 4.5        C
18 8.0 5.0        C

根据每个不同 category 值的最后 3 个 y 值之和的顺序,我想附加一个数字加一个点作为前缀类别列的值。对于上面的示例,对于 B1313.515.5 的总和将按升序排列,CA 分别。分类列值前缀的数字应根据category标签相应地表示此顺序,即1.B2.C, 3.A 应该是 category 中对原 B, C 重命名的值A 分别。我想要的输出如下所示:

     x   y category
1  0.0 0.0      3.A
2  1.0 2.0      3.A
3  2.0 3.0      3.A
4  5.0 5.0      3.A
5  6.5 5.5      3.A
6  8.0 5.0      3.A
7  0.0 0.0      1.B
8  1.0 3.0      1.B
9  2.0 3.5      1.B
10 4.0 4.0      1.B
11 6.0 4.0      1.B
12 8.0 5.0      1.B
13 0.0 0.0      2.C
14 1.5 2.5      2.C
15 3.0 3.0      2.C
16 4.0 4.0      2.C
17 6.5 4.5      2.C
18 8.0 5.0      2.C

我能够在列表中收集具有相应 category 值的有序总和值,但我无法思考过去:

endsum <- list()
diff <- unique(df$category)
for(i in 1:length(diff)) {
  endsum[diff[i]] <- sum(tail(subset(df, category == diff[i])$y, 3))
}
endsum <- endsum[order(sapply(endsum, function(a) a))]
> endsum
$B
[1] 13

$C
[1] 13.5

$A
[1] 15.5

我确实考虑过将 names(endsum)[i]df$category 进行比较,同时逐行遍历 df 并进行匹配,将列表顺序中维护的数字附加到一个点,即例如当 names(endsum)[1] 中的 B 与数据框的类别标签 B 的第 7-12 行匹配时df,它将在列表 i 中的顺序为 1,并将它作为前缀(用点)添加到 df 的第 7-12 行,转将 B 转换为 1.B

但是,我不确定它的实现,这似乎不是最好的方法。谁能建议一种更好的方法来实现这一目标?帮助将不胜感激!

最佳答案

一种单衬基 R 溶液。由于r中的rank()中没有ties.method = "dense",所以我先将其转化为factor再as.integer返回密集的行列。

df$category <- paste(as.integer(factor(rank(ave(df$y, df$category, FUN = function(x){n <- length(x); sum(x[(n-2):n])}), 
     ties.method = "min"))), df$category, sep = ".")

df
     x   y category
1  0.0 0.0      3.A
2  1.0 2.0      3.A
3  2.0 3.0      3.A
4  5.0 5.0      3.A
5  6.5 5.5      3.A
6  8.0 5.0      3.A
7  0.0 0.0      1.B
8  1.0 3.0      1.B
9  2.0 3.5      1.B
10 4.0 4.0      1.B
11 6.0 4.0      1.B
12 8.0 5.0      1.B
13 0.0 0.0      2.C
14 1.5 2.5      2.C
15 3.0 3.0      2.C
16 4.0 4.0      2.C
17 6.5 4.5      2.C
18 8.0 5.0      2.C

关于r - 带有基于顺序的数字的分类列的前缀标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66558722/

相关文章:

r - 如何在R中的list()中滑动元素的长度?

R 的随机森林无法分配大小为 7.5 Gb 的向量

xml - 处理 R 中的空 XML 节点

r - 如何对 dplyr 中的多个变量进行排名

r - 如何打印多个项目进行输出?

R - 找到第 2 组(成对)的簇

r - 在R中,根据行之间的差异计算新列

R - 从调用对象获取形式

r - 使用 ggplot2 创建带有预先汇总数据的条形图

R 从时间中获取特定的小时