r - 使用嵌套的 ifesle 进行变异
问题描述
我确实得到了错误的结果,我做错了什么?
df <- data.frame(x=c(1,1,NA),y=c(1,NA,NA),z=c(NA,NA,NA))
df <-mutate(df,result=ifelse(is.na(x),NA,ifelse(any(!is.na(y),!is.na(z)),1,0)))
我明白了(数据[2,4]==0)
x y z result
1 1 1 NA 1
2 1 NA NA 1
3 NA NA NA NA
而不是这个:
df_wanted <- data.frame(x=c(1,1,NA),y=c(1,NA,NA),z=c(NA,NA,NA), result=c(1,0,NA))
x y z result
1 1 1 NA 1
2 1 NA NA 0
3 NA NA NA NA
解决方案
我们可以使用|
而不是any
因为any
返回单个 TRUE/FALSE 作为输出
with(df, any(!is.na(y), !is.na(z)))
#[1] TRUE
并且整个列都被回收了,因为第一个ifelse
带有“x”的第三行已经返回“NA”,所有其他的都返回 1
相反,我们需要为每一行执行此操作,这可以通过|
library(dplyr)
df %>%
mutate(result = ifelse(is.na(x), NA, ifelse(!is.na(y)|!is.na(z), 1, 0)))
# x y z result
#1 1 1 NA 1
#2 1 NA NA 0
#3 NA NA NA NA
或者另一种选择是case_when
df %>%
mutate(result = case_when(is.na(x) ~ NA_integer_,
!is.na(y)| !is.na(z) ~ 1L,
TRUE ~ 0L))
# x y z result
#1 1 1 NA 1
#2 1 NA NA 0
#3 NA NA NA NA
或与coalesce
df %>%
mutate(result = x * +coalesce(!is.na(y)|!is.na(z)))
# x y z result
#1 1 1 NA 1
#2 1 NA NA 0
#3 NA NA NA NA
推荐阅读
- f# - Deedle、F# 和读取 csv
- reactjs - 收到非布尔属性“showheader”的“false”。如果要将其写入 DOM,请改为传递一个字符串:showheader="false"
- python-3.x - 想要在不使用 numpy 的情况下将 n 个矩阵存储在 python 中的单个列表中。我正在尝试实现人口中每个矩阵的一个副本
- highcharts - Highcharts 符号未出现在图表中(不透明度设置为 0,它会出现)
- android - Android 在库项目中添加 Firebase Crashlytics
- oracle - ORA-20002:不允许更改关键模式的密码
- android - 使用 fetch 在 Android 设备上的网络请求失败
- javascript - Node Soap - http 获取请求返回 index.html
- netbeans - 为什么我的 NetBeans 11.2 IDE 在启动时冻结,我该如何解决?
- android - 如何使用android上的firebase数据库将帖子移动到特定位置