【发布时间】:2021-09-16 21:31:33
【问题描述】:
我有一个这样的数据框:
| ID_CLI | CHURN |
|---|---|
| 12 | 0 |
| 12 | 0 |
| 25 | 1 |
| 25 | 1 |
| 25 | 1 |
| 27 | 0 |
我想在 ID_CLI 上进行分组并得到如下输出:
| ID_CLI | CHURN |
|---|---|
| 12 | 0 |
| 25 | 1 |
| 27 | 0 |
【问题讨论】:
标签: r
我有一个这样的数据框:
| ID_CLI | CHURN |
|---|---|
| 12 | 0 |
| 12 | 0 |
| 25 | 1 |
| 25 | 1 |
| 25 | 1 |
| 27 | 0 |
我想在 ID_CLI 上进行分组并得到如下输出:
| ID_CLI | CHURN |
|---|---|
| 12 | 0 |
| 25 | 1 |
| 27 | 0 |
【问题讨论】:
标签: r
这是dplyr的方式。
library(dplyr)
df1 %>%
count(ID_CLI, CHURN) %>%
group_by(ID_CLI) %>%
slice_max(order_by = n, n = 1) %>%
select(-n)
## A tibble: 3 x 2
## Groups: ID_CLI [3]
# ID_CLI CHURN
# <int> <int>
#1 12 0
#2 25 1
#3 27 0
还有一个基本的 R 方式。
df2 <- local({
tbl <- table(df1)
data.frame(
ID_CLI = unique(df1$ID_CLI),
CHURN = colnames(tbl)[apply(tbl, 1, which.max)]
)
})
df2
# ID_CLI CHURN
#1 12 0
#2 25 1
#3 27 0
df1 <- read.table(text = "
ID_CLI CHURN
12 0
12 0
25 1
25 1
25 1
27 0
", header = TRUE)
【讨论】:
我想我找到了答案:
df <- df %>%
group_by(ID_CLI) %>%
summarize (CHURN =names(which.max(table(CHURN))))
【讨论】:
这是一个非常简单的操作。我建议您查看一些初学者包,尤其是从dplyr 开始。不过,这里有一个对您有用的答案。
library(dplyr)
df %>%
distinct()
df 由以下给出:
df <- structure(list(ID_CLI = c(12, 12, 25, 25, 25, 27),
CHURN = c(0, 0, 1, 1, 1, 0)),
class = "data.frame", row.names = c(NA, -6L))
您可以使用?distinct 了解它的运作方式以备将来使用。快速入门的备忘单:
https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
【讨论】:
您可以从此处使用Mode 函数并将其应用于每个组。
library(dplyr)
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
df %>% group_by(ID_CLI) %>% summarize(CHURN = Mode(CHURN))
# ID_CLI CHURN
# <int> <int>
#1 12 0
#2 25 1
#3 27 0
【讨论】: