我有一个纵向数据集,包含不同社会经济地位(SE)的个体,分为4个类别,高、中、低、中和低.对于一些分析,我只想显示中低收入组的样本量,如果both个中低收入组在当月的观察中至少有5个人.否则,我希望它显示为NA.

我认为这个代码可以工作,但它不能.它应该在1月份给NA中低端组的"adjusted_total"列,但将其保留为2月份的当前值(40).它无法完成前者,但完成了后者:

这是我的示例数据集,try 使用dplyr的case\u when()获得我想要的:

library(dplyr)

#Sample dataset
test_data <- tibble(month = c(rep(c("Jan"), 4), rep(c("Feb"), 4)),
                    ses = c(rep(c("High", "Mid", "Mid Low", "Low"), 2)),
                    total = c(10, 20, 4, 30, 9, 11, 40, 60),
                    total_selected = c(9, 10, 8, 3, 8, 6, 8, 6))

#Failed attempt
wrong <- test_data %>%
group_by(month) %>%
  mutate(adjusted_total = case_when(
    ses == "Mid Low" & total[ses == "Mid"] <5 | total[ses == "Low"] <5 ~ NA_real_,
    TRUE ~ total
  ))

EDIT WITH SOLUTION

我意识到我的代码有一个拼写错误.首先,我指的是or语句,而不是AND.其次,阈值对于我的数据来说太低了.当我调整到OR语句,并且截止到15时


correct <- tibble(month = c(rep(c("Jan"), 4), rep(c("Feb"), 4)),
                    ses = c(rep(c("High", "Mid", "Mid Low", "Low"), 2)),
                    total = c(10, 20, 4, 30, 9, 11, 40, 60),
                    total_selected = c(9, 10, 8, 3, 8, 6, 8, 6)) %>%
  group_by(month) %>%
  mutate(adjusted_total = case_when(
    ses == "Mid Low" & total[ses == "Mid"] < 15 | total[ses == "Low"] < 15 ~ NA_real_,
    TRUE ~ total
  ))

推荐答案

case_when/ifelse/if_else所有参数都要求参数长度相同.这里,其中一个逻辑表达式的长度不同.正确的方法是使用"total"子集的any进行包装

test_data %>%
group_by(month) %>%
  mutate(adjusted_total = case_when(
    ses == "Mid Low" & any(total[ses  %in% c("Mid", "Low")] < 15) ~ NA_real_,
    TRUE ~ total
  )) %>% 
ungroup

-输出

# A tibble: 8 × 5
  month ses     total total_selected adjusted_total
  <chr> <chr>   <dbl>          <dbl>          <dbl>
1 Jan   High       10              9             10
2 Jan   Mid        20             10             20
3 Jan   Mid Low     4              8              4
4 Jan   Low        30              3             30
5 Feb   High        9              8              9
6 Feb   Mid        11              6             11
7 Feb   Mid Low    40              8             NA
8 Feb   Low        60              6             60

或与replace

test_data %>%
   group_by(month) %>% 
   mutate(adjusted_total = replace(total,
    ses == "Mid Low" & any(total[ses %in% c("Mid", "Low")] < 15), 
    NA)) %>%
   ungroup

R相关问答推荐

DT::可数据的正规表达OR运算符问题

保存shiny 的代码嗅探器:避免$ Symbol问题

R中的枢轴/转置

混淆矩阵,其中每列和等于1

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

过滤器数据.基于两列的帧行和R中的外部向量

如何在R中合并和合并多个rabrame?

IMF IFS数据以R表示

Ggplot2中的重复注记

使用范围和单个数字将数字与字符串进行比较

悬崖三角洲超大型群数计算导致整数溢出

为什么在BASE R中绘制线条时会看到线上的点?

R如何将列名转换为更好的年和月格式

远离理论值的伽马密度曲线下面积的近似

有没有办法一次粘贴所有列

将摘要图添加到facet_WRAP gglot的末尾

如何为混合模型输出绘制不同的线型?

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

变异以按组从其他列创建具有最大和最小值的新列

对计算变量所有唯一值的变量进行变异