用R中的行最大值替换nan值

用R中的行最大值替换nan值,r,dataframe,R,Dataframe,我有以下数据帧(df): 我需要用每行的最大值替换NA值。我期望的输出是: PARTY_ID O1 O2 O3 O4 P1 20 20 20 20 P2 3 18 18 18 我需要尽快完成这项工作,因为我的数据有60万行。 有人能帮我吗?我没有可复制的数据集,但这可能有效: t(apply(df_mat, 1, function(x) {ifelse(is.na(x), max(x, na.rm = TRUE), x)})) 我没有可复制的数据集,但这可能有效: t(apply(df_ma

我有以下数据帧(df):

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

PARTY_ID O1 O2 O3 O4
P1 20 20 20 20
P2 3 18 18 18
我需要尽快完成这项工作,因为我的数据有60万行。
有人能帮我吗?

我没有可复制的数据集,但这可能有效:

t(apply(df_mat, 1, function(x) {ifelse(is.na(x), max(x, na.rm = TRUE), x)}))

我没有可复制的数据集,但这可能有效:

t(apply(df_mat, 1, function(x) {ifelse(is.na(x), max(x, na.rm = TRUE), x)}))

来自动物园的解决方案
na.locf

data.frame(t(na.locf(t(A))))

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

来自动物园的解决方案
na.locf

data.frame(t(na.locf(t(A))))

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

使用
tidyverse
Reforme2
软件包可以有多个选项

选项#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提到了,因为她在data.frame中获得了大量行(
600K
)。因此,另一种选择是处理宽格式数据本身
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)

df使用
tidyverse
reformae2
软件包可以有多个选项

选项#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提到了,因为她在data.frame中获得了大量行(
600K
)。因此,另一种选择是处理宽格式数据本身
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)

df这应该非常快,因为它是一个单一的赋值,而不是逐行赋值:

idxna <- which(is.na(df[-1]), arr.ind=TRUE)
df[-1][idxna] <- do.call(pmax, c(df[-1], na.rm=TRUE))[idxna[,"row"]]
df

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

idxna这应该非常快,因为它是一个单一的赋值,而不是逐行赋值:

idxna <- which(is.na(df[-1]), arr.ind=TRUE)
df[-1][idxna] <- do.call(pmax, c(df[-1], na.rm=TRUE))[idxna[,"row"]]
df

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

idxna抱歉,但它不起作用。它是我的数据帧的名称吗?在这种情况下,我的输出是:
X167302 X167303 X167304
对不起,它不起作用。它是我的数据帧的名称吗?在这种情况下,我的输出是:
X167302 X167303 X167304
谢谢您的回答,但它不会替换NA值:cI have遗忘NA.rm=TRUE。您现在可以试试吗?谢谢您的回答,但它不能替换NA值:cI已忘记NA。rm=TRUE。你现在能试试吗?