gpt4 book ai didi

r - 如何从数据框中的多列中找到最频繁的值

转载 作者:行者123 更新时间:2023-12-04 12:02:33 26 4
gpt4 key购买 nike

我的数据框如下:

S A B C D E 
1 N N N N N
2 N Y Y N N
3 Y N Y N N
4 Y N Y Y Y

我需要在哪里创建一个新列 F,其中包含多列 A、B、C、D 和 E 中出现次数最多的字符?

输出应如下所示:
 S A B C D E F
1 N N N N N N
2 N Y Y N N N
3 Y N Y N N N
4 Y N Y Y Y Y

最佳答案

我们可以创建一个 Mode函数并应用于行

df1$F <- apply(df1[-1], 1, Mode)
df1
# S A B C D E F
#1 1 N N N N N N
#2 2 N Y Y N N N
#3 3 Y N Y N N N
#4 4 Y N Y Y Y Y

或者另一种选择是
df1$F <- c('N', 'Y')[max.col(table(c(row(df1[-1])), unlist(df1[-1])), 'first')]

在哪里
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}

或使用 tidyverse
library(tidyverse)
df1 %>%
mutate(F = pmap_chr(.[-1], ~ Mode(c(...))))

或者另一种选择是
gather(df1, key, F, - S) %>% 
group_by(S, F) %>%
summarise(n = n()) %>%
slice(which.max(n)) %>%
ungroup %>%
dplyr::select(F) %>%
bind_cols(df1, .)

或者我们转置数据集,应用 Mode按每一列,然后将输出作为新列绑定(bind)到原始数​​据集
t(df1[-1]) %>%
as.data.frame %>%
summarise_all(Mode) %>%
unlist %>%
bind_cols(df1, F = .)

或带有 data.table 的选项
library(data.table)
setDT(df1)[, F := names(which.max(table(unlist(.SD)))), S][]

注意:这些是通用方法,而不是仅检查单个案例

如果我们需要一个有效的方法,没有任何 ifelse ,我们也可以通过
df1$F <- c("Y", "N")[(rowSums(df1[-1] == "N") > 2) + 1]
df1$F
#[1] "N" "N" "N" "Y"

或与 Reduce
c("Y", "N")[(Reduce(`+`, lapply(df1[-1], `==`, "N")) > 2) + 1]

或者另一种方法是
c("Y", "N")[(str_count(do.call(paste0, df1[-1]), "N") > 2) + 1]

数据
df1 <- structure(list(S = 1:4, A = c("N", "N", "Y", "Y"), B = c("N", 
"Y", "N", "N"), C = c("N", "Y", "Y", "Y"), D = c("N", "N", "N",
"Y"), E = c("N", "N", "N", "Y")), class = "data.frame", row.names = c(NA,
-4L))

关于r - 如何从数据框中的多列中找到最频繁的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com