首页 > 解决方案 > 用 R 中的最大行替换 nan 值

问题描述

我有以下数据框(df):

PARTY_ID O1 O2 O3 O4
P1 20 NA NA NA
P2 3 18 NA NA

我需要用每行的最大值替换 NA 值。我想要的输出是:

PARTY_ID O1 O2 O3 O4
P1 20 20 20 20
P2 3 18 18 18

我需要快速执行此操作,因为我的数据有 600K 行。任何人都可以帮助我吗?

标签: rdataframe

解决方案


tidyverse使用&reshape2包可以有多个选项。

选项#1:您可以转换长格式的数据并对其进行处理。最后使用dcast.

library(tidyverse)
library(reshape2)

df %>% gather(Key, Value, -PARTY_ID) %>%
  group_by(PARTY_ID) %>%
  mutate(Value = ifelse(is.na(Value), max(Value, na.rm = TRUE), Value)) %>%
  dcast(PARTY_ID~Key, value.var = "Value")

#   PARTY_ID O1 O2 O3 O4
# 1       P1 20 20 20 20
# 2       P2  3 18 18 18

选项#2: OP 提到她600K在 data.frame 中有大量行 ()。因此,另一种选择是处理宽格式本身的数据。dplyr::mutate_at在这种情况下会有很大帮助。我会更喜欢这个选项。

library(dplyr)

df %>% mutate(RowMax = apply(select(.,starts_with("O")), 1, FUN=max, na.rm=TRUE)) %>%
  mutate_at(vars(starts_with("O")), funs(ifelse(is.na(.), RowMax,.))) %>%
  select(-RowMax)

#   PARTY_ID O1 O2 O3 O4
# 1       P1 20 20 20 20
# 2       P2  3 18 18 18

数据:

df <- read.table(text = 
"PARTY_ID O1 O2 O3 O4
P1 20 NA NA NA
P2 3 18 NA NA",
header = TRUE, stringsAsFactors = FALSE)

推荐阅读