gpt4 book ai didi

r - 基于 dplyr 链中多列的条件评估的变异变量

转载 作者:行者123 更新时间:2023-12-01 11:13:14 25 4
gpt4 key购买 nike

考虑以下数据集:

  patientID age     age2      age3 equal
1 1 25 25 25 TRUE
2 2 34 34 32 FALSE
3 3 28 28 20 FALSE
4 4 52 18 19 FALSE

如果 ageage2age3 相等,我想改变一个为 TRUE 的 equal 列对彼此。我认为这会很简单:

data %>% 
mutate(equal = ifelse(age == age_2 == age_3, 1, 0))

但我猜 R 无法连续解释三个 == 符号,因为它会给出“意外符号,==”错误。我这样更正:

data %>% 
mutate(equal = ifelse(isTRUE(all.equal(age, age_2, age_3)), 1, 0))

它为每一列返回 "FALSE" 的值。在避免多个成对 if 语句的同时执行此操作的正确方法是什么? (例如 (age == age_2) & (age_2 == age_3))?

最佳答案

一个更简单的选择是将“年龄”列中的第一列与其余列进行比较,并使用 rowSums 创建一个逻辑条件。

nm1 <- grep("age", names(data))
data$equal <- !rowSums(data[nm1][,1] != data[nm1])
data$equal
#[1] TRUE FALSE FALSE FALSE

我们也可以使用tidyverse

library(tidyverse)
data %>%
mutate(equal = pmap(select(., starts_with('age')),
~ n_distinct(c(...)) == 1))
# patientID age age2 age3 equal
#1 1 25 25 25 TRUE
#2 2 34 34 32 FALSE
#3 3 28 28 20 FALSE
#4 4 52 18 19 FALSE

数据

data <- structure(list(patientID = 1:4, age = c(25L, 34L, 28L, 52L), 
age2 = c(25L, 34L, 28L, 18L), age3 = c(25L, 32L, 20L, 19L
)), row.names = c("1", "2", "3", "4"), class = "data.frame")

关于r - 基于 dplyr 链中多列的条件评估的变异变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010188/

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