考虑一个包含两个数字列(x
、y
)和一个包含字符串的分类列(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
值之和的顺序,我想附加一个数字加一个点作为前缀类别列的值。对于上面的示例,对于 B
,13
、13.5
和 15.5
的总和将按升序排列,C
和 A
分别。分类列值前缀的数字应根据category
标签相应地表示此顺序,即1.B
、2.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/