gpt4 book ai didi

R ifelse(apply(max)) 涉及一个、两个或不涉及 NA

转载 作者:行者123 更新时间:2023-12-02 08:40:24 25 4
gpt4 key购买 nike

我有一个数据集,其中大量填充了缺失值。我试图通过找到两列的最大值来使其中一些消失。所以我的数据集是这样的:

df1 <- data.frame(id = 1:20, col1 = runif(20)*100, col2 = runif(20)*100)

df1[c(1,3,7,12,18),'col1'] <- NA
df1[c(2,4,7,14,18),'col2'] <- NA

> head(df1,10)
id col1 col2
1 1 NA 71.073951
2 2 20.51551 NA
3 3 NA 14.308692
4 4 82.31036 NA
5 5 15.89198 44.190152
6 6 82.72071 20.761311
7 7 NA NA
8 8 87.80027 8.615998
9 9 26.98488 90.835827
10 10 14.61701 5.184187

经过反复试验,我找到了找到 max 的唯一方法的 2 列并处理 NA's是嵌套的 ifelse声明:

df1$col3 <- NA
df1$col3 <- ifelse(is.na(df1$col1) & is.na(df1$col2), NA, ifelse(!is.na(df1$col1) & is.na(df1$col2), df1$col1
,ifelse(is.na(df1$col1) & !is.na(df1$col2), df1$col2
,ifelse(!is.na(df1$col1) & !is.na(df1$col2), apply(df1[,c('col1','col2')],1,max), df1$col3)))
)

给出:

> df1
id col1 col2 col3
1 1 NA 71.073951 71.07395
2 2 20.51551 NA 20.51551
3 3 NA 14.308692 14.30869
4 4 82.31036 NA 82.31036
5 5 15.89198 44.190152 44.19015
6 6 82.72071 20.761311 82.72071
7 7 NA NA NA
8 8 87.80027 8.615998 87.80027
9 9 26.98488 90.835827 90.83583
10 10 14.61701 5.184187 14.61701

这些看起来过于复杂。有没有人有更好的解决方案?

最佳答案

一步解决NA-Inf问题:

df1$col3 <- apply(
df1[2:3],
1,
function(x) ifelse(all(is.na(x)),NA,max(x,na.rm=TRUE))
)

或者使用 pmax 的替代方法:

df1$col3 <- apply(df1[2:3],1,function(x) pmax(x[1],x[2],na.rm=TRUE))

结果:

   id      col1      col2      col3
1 1 NA 18.614950 18.614950
2 2 13.492240 NA 13.492240
3 3 NA 3.430721 3.430721
4 4 51.825729 NA 51.825729
5 5 54.134056 61.749744 61.749744
6 6 14.953350 44.932748 44.932748
7 7 NA NA NA

关于R ifelse(apply(max)) 涉及一个、两个或不涉及 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036715/

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