首页 > 解决方案 > 更改数据框中变量的值:≥16 为“1”,<16 为“0”?

问题描述

如果我有一个data带有变量的数据框CESD,我想将 ≥ 16 的值更改CESD为“1”,将 < 16 更改为“0”(注意:这个向量中有 NA,我希望忽略它们),什么 R 函数我可以用吗?

mutate()在 dplyr 包中尝试过,但它不起作用

library(tidyverse)
data = data %>%
  mutate(CESD = recode(CESD, `1` = CESD[CESD >= 16 & !is.na(CESD)], `0` = CESD[CESD < 16 & !is.na(CESD)]))

R 中的消息返回:mutate_impl(.data, dots) 中的错误:评估错误:向量 1 的长度必须为 419 或 1,而不是 88。

标签: rdataframe

解决方案


我们这里不需要recode。只需使用 . 将逻辑表达式转换为二进制即可as.integer。TRUE 值更改为 1,其他值更改为 0,而NA原始数据中的元素保持不变。

data %>%
    mutate(CESD = (CESD >= 16 & !is.na(CESD)) * NA^(is.na(CESD)))

或仅使用base R

data$CESD <- with(data, (CESD >= 16 & !is.na(CESD)) * NA^(is.na(CESD))))

或者我们为元素创建一个逻辑表达式NA并只为非 NA 元素更新

i1 <- !is.na(data$CESD)
data$CESD[i1] <- as.integer(data$CESD[i1] >= 16)

可以更紧凑地写成data.table

library(data.table)
setDT(data)[!is.na(CESD), CESD := as.integer(CESD >= 16)]

注意:如果值需要character分类,请用as.character

数据

set.seed(24)
data <- data.frame(CESD = sample(c(NA, 1:5, 15:20), 50, replace = TRUE), 
           col2 = rnorm(50))

推荐阅读