首页 > 解决方案 > 创建一个以采用不同行的值为条件的变量

问题描述

创建一个以采用不同行的值为条件的变量。例如。我有一个数据库,由 3 个变量组成。(ID、COD1、COD2)。

ID代表识别码。COD1:代表每个个体所属的类别。COD2:代表注册表特征。

我们要创建一个变量 3:COD3,它表示个人属于多少 COD1 类别。

COD3 = A 如果相同的 ID 在 COD1 中有 2 个类别

COD3 = B 如果相同的 ID 在 COD1 中有 3 个类别

COD3 = C 如果相同的 ID 在 COD1 中只有一个类别

我正在考虑使用 dplyr 的代码,如下所示,但我不知道如何制作不仅考虑行而且考虑整个组的条件。

df %>% mutate(COD3 = case_when(ID == 1 & COD2 == ?? ~ A)

我有的。

ID COD1 COD2
01 10 1SW
01 11 232
01 10 12D
02 10 13V
02 11 2P0
02 12 PL4
03 10 55R
03 10 P01
03 10 MN7

我想要的是

ID COD1 COD2 COD3
01 10 1SW 一个
01 11 232 一个
01 10 12D 一个
02 10 13V
02 11 2P0
02 12 PL4
03 10 55R C
03 10 P01 C
03 10 MN7 C

我将不胜感激在这方面的任何帮助。

标签: rdatabasedplyr

解决方案


library(dplyr)

df %>% 
  group_by(ID) %>% 
  mutate(COD3 = c("C", "A", "B")[n_distinct(COD1)]) %>% 
  ungroup()

或者在基地R

df$COD3 <- unlist(lapply(with(df, split(COD1, ID)), function(x) c("C", "A", "B")[rep(length(unique(x)), length(x))]))

输出

     ID  COD1 COD2  COD3 
  <int> <int> <chr> <chr>
1     1    10 1SW   A    
2     1    11 232   A    
3     1    10 12D   A    
4     2    10 13V   B    
5     2    11 2P0   B    
6     2    12 PL4   B    
7     3    10 55R   C    
8     3    10 P01   C    
9     3    10 MN7   C    

推荐阅读