用R中的行最大值替换nan值
我有以下数据帧(df): 我需要用每行的最大值替换NA值。我期望的输出是:用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
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。你现在能试试吗?