我想根据F1列分组时最常见的F2值来填充F2列中的NA值。
F1 F2
1 A C
2 B D
3 A NA
4 A C
5 B NA
所需结果:
F1 F2
1 A C
2 B D
3 A C
4 A C
5 B D
谢谢您的帮助
答案 0 :(得分:3)
这是基本的R解决方案。首先为Mode定义一个函数(取自here),然后将其应用于您的数据框,即
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
df$F2 <- with(df, ave(F2, F1, FUN = function(i) replace(i, is.na(i), Mode(i))))
df
# F1 F2
#1 A C
#2 B D
#3 A C
#4 A C
#5 B D
答案 1 :(得分:1)
这是使用dplyr
的一种方法:
library(dplyr)
df %>%
group_by(F1) %>%
mutate(F2 = replace(F2, is.na(F2),
names(sort(table(F2), decreasing = TRUE)[1])))
# F1 F2
# <chr> <chr>
#1 A C
#2 B D
#3 A C
#4 A C
#5 B D
如果是平局,则按字典顺序优先。
答案 2 :(得分:0)
尝试一下:
首先在df2
中,我获得了变量F1
的最大计数,其中F2不丢失。当按F1分组时,这将为您提供最常见的F2值。我将其重新连接到原始data.frame上,并使用mutate
填充新变量F2_fill
,然后从data.frame的该变量中将其删除。
library(tidyverse)
df <- tribble(
~F1, ~F2,
'A', 'C',
'B' , 'D',
'A' ,NA,
'A', 'C',
'B', NA)
df2 <- df %>%
group_by(F1) %>%
count(F2) %>%
filter(!is.na(F2), n == max(n)) %>%
select(-n) %>%
rename(F2_fill = F2)
df3 <- left_join(df,df2, by="F1") %>%
mutate(F2 = ifelse(is.na(F2), F2_fill,F2)) %>%
select(-F2_fill)
答案 3 :(得分:0)
如果ave
是table
,则可以将which.max
与is.na
和character
一起使用,并与i <- is.na(x$F2)
x$F2[i] <- ave(x$F2, x$F1, FUN=function(y) names(which.max(table(y))))[i]
x
# F1 F2
#1 A C
#2 B D
#3 A C
#4 A C
#5 B D
进行子设置。
x <- data.frame(F1 = c("A", "B", "A", "A", "B")
, F2 = c("C", "D", NA, "C", NA))
数据:
onclick="myFunction();myFunction2()"