总结数据框中的最低值?
Summarize the lowest values in a Dataframe?
我的数据框如下所示:
View(df)
Product Value
a 2
b 4
c 3
d 10
e 15
f 5
g 6
h 4
i 50
j 20
k 35
l 25
m 4
n 6
o 30
p 4
q 40
r 5
s 3
t 40
我想找到 9 种最昂贵的产品并汇总其余产品。它应该是这样的:
Product Value
d 10
e 15
i 50
j 20
k 35
l 25
o 30
q 40
t 40
rest 46
剩下的是其他11个产品的总和。
我用 summaries
试过了,但没用:
new <- df %>%
group_by(Product)%>%
summarise((Value > 10) = sum(Value)) %>%
ungroup()
在使用 arrange
按 Value
对数据排序后,我们可以使用 dplyr::row_number
对观察结果进行有效排序。然后,我们扩充 Product
列,以便将不在前 9 名中的任何值编码为 Rest
。最后,我们按更新后的 Product
分组并使用 summarise
求和
dat %>%
arrange(desc(Value)) %>%
mutate(RowNum = row_number(),
Product = ifelse(RowNum <= 9, Product, 'Rest')) %>%
group_by(Product) %>%
summarise(Value = sum(Value))
# A tibble: 10 × 2
Product Value
<chr> <int>
1 d 10
2 e 15
3 i 50
4 j 20
5 k 35
6 l 25
7 o 30
8 q 40
9 Rest 46
10 t 40
数据
dat <- structure(list(Product = c("a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"
), Value = c(2L, 4L, 3L, 10L, 15L, 5L, 6L, 4L, 50L, 20L, 35L,
25L, 4L, 6L, 30L, 4L, 40L, 5L, 3L, 40L)), .Names = c("Product",
"Value"), class = "data.frame", row.names = c(NA, -20L))
使用 dplyr
的另一种方法是使用 do
创建结果。由于您需要使用 .$
,因此代码变得有点难以阅读,但您可以避免使用 ifelse/if_else
。按Value
排列顺序后,可以创建两个向量。一个具有前九个产品名称和 "rest"。另一个具有前九个值和其他值的值之和。您直接使用 do
.
创建数据框
df %>%
arrange(desc(Value)) %>%
do(data.frame(Product = c(as.character(.$Product[1:9]), "Rest"),
Value = c(.$Value[1:9], sum(.$Value[10:length(.$Value)]))))
# Product Value
#1 i 50
#2 q 40
#3 t 40
#4 k 35
#5 o 30
#6 l 25
#7 j 20
#8 e 15
#9 d 10
#10 Rest 46
这是一个使用 data.table
的选项
library(data.table)
setDT(df)[, i1 := .I][order(desc(Value))
][-(seq_len(9)), Product := 'rest'
][, .(Value = sum(Value), i1=i1[1L]), Product
][order(Product=='rest', i1)][, i1 := NULL][]
# Product Value
#1: d 10
#2: e 15
#3: i 50
#4: j 20
#5: k 35
#6: l 25
#7: o 30
#8: q 40
#9: t 40
#10: rest 46
我的数据框如下所示:
View(df)
Product Value
a 2
b 4
c 3
d 10
e 15
f 5
g 6
h 4
i 50
j 20
k 35
l 25
m 4
n 6
o 30
p 4
q 40
r 5
s 3
t 40
我想找到 9 种最昂贵的产品并汇总其余产品。它应该是这样的:
Product Value
d 10
e 15
i 50
j 20
k 35
l 25
o 30
q 40
t 40
rest 46
剩下的是其他11个产品的总和。
我用 summaries
试过了,但没用:
new <- df %>%
group_by(Product)%>%
summarise((Value > 10) = sum(Value)) %>%
ungroup()
在使用 arrange
按 Value
对数据排序后,我们可以使用 dplyr::row_number
对观察结果进行有效排序。然后,我们扩充 Product
列,以便将不在前 9 名中的任何值编码为 Rest
。最后,我们按更新后的 Product
分组并使用 summarise
dat %>%
arrange(desc(Value)) %>%
mutate(RowNum = row_number(),
Product = ifelse(RowNum <= 9, Product, 'Rest')) %>%
group_by(Product) %>%
summarise(Value = sum(Value))
# A tibble: 10 × 2
Product Value
<chr> <int>
1 d 10
2 e 15
3 i 50
4 j 20
5 k 35
6 l 25
7 o 30
8 q 40
9 Rest 46
10 t 40
数据
dat <- structure(list(Product = c("a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"
), Value = c(2L, 4L, 3L, 10L, 15L, 5L, 6L, 4L, 50L, 20L, 35L,
25L, 4L, 6L, 30L, 4L, 40L, 5L, 3L, 40L)), .Names = c("Product",
"Value"), class = "data.frame", row.names = c(NA, -20L))
使用 dplyr
的另一种方法是使用 do
创建结果。由于您需要使用 .$
,因此代码变得有点难以阅读,但您可以避免使用 ifelse/if_else
。按Value
排列顺序后,可以创建两个向量。一个具有前九个产品名称和 "rest"。另一个具有前九个值和其他值的值之和。您直接使用 do
.
df %>%
arrange(desc(Value)) %>%
do(data.frame(Product = c(as.character(.$Product[1:9]), "Rest"),
Value = c(.$Value[1:9], sum(.$Value[10:length(.$Value)]))))
# Product Value
#1 i 50
#2 q 40
#3 t 40
#4 k 35
#5 o 30
#6 l 25
#7 j 20
#8 e 15
#9 d 10
#10 Rest 46
这是一个使用 data.table
library(data.table)
setDT(df)[, i1 := .I][order(desc(Value))
][-(seq_len(9)), Product := 'rest'
][, .(Value = sum(Value), i1=i1[1L]), Product
][order(Product=='rest', i1)][, i1 := NULL][]
# Product Value
#1: d 10
#2: e 15
#3: i 50
#4: j 20
#5: k 35
#6: l 25
#7: o 30
#8: q 40
#9: t 40
#10: rest 46