根据条件对独特的观察进行编码

Code unique observations based on condition

假设我有一个数据集

car_manu    owner
ford         1
toyota       1
ford         2
ford         3
ford         3
ford         3

我想创建一个变量来说明他们是否是 'one car owner' - 这意味着车主 2 是一名车主。我知道这会使用 unique(df$owner) 但我不确定将其分配给观察。

预期输出是

 car_manu owner     type
     ford     1 multicar   
   toyota     1 multicar
     ford     2   onecar
     ford     3 multicar
     ford     3 multicar
     ford     3 multicar

使用 dplyr:

library(dplyr)
df %>% group_by(owner) %>%
       mutate(onecar = ifelse(n()==1, 1, 0))

如果您需要使用 'owner' 作为分组变量,根据观察次数创建一个列,那么我们可以使用 data.table。我们将 'data.frame' 更改为 'data.table' (setDT(df1))。按 'owner' 分组,我们检查条件 if(.N==1) 它将是 'one car owner' 否则 'multi-car' 并将输出分配给新列 'owner_type'

 library(data.table)
 setDT(df1)[, owner_type :=if(.N==1) 'one-car' else 'multi-car', owner]

或者不使用 if/else 条件,我们可以通过 'owner' 创建一个逻辑向量 (.N!=1),将其加 1 并将其用作数字索引以将其替换为'one-car', 'multi-car'.

  setDT(df1)[, owner_type:=c('one-car', 'multi-car')[(.N!=1)+1] , owner]
  df1
  #   car_manu owner owner_type
  #1:     ford     1  multi-car
  #2:   toyota     1  multi-car
  #3:     ford     2    one-car
  #4:     ford     3  multi-car
  #5:     ford     3  multi-car
  #6:     ford     3  multi-car

使用 base 并给定名为 d 的数据框,您可以使用 ifelseave 函数,如下所示:

d$type=ifelse(ave(d$owner,d$owner,FUN=length)==1,"one car","multicar")
d
  #   car_manu owner type
  #1:     ford     1  multi-car
  #2:   toyota     1  multi-car
  #3:     ford     2    one-car
  #4:     ford     3  multi-car
  #5:     ford     3  multi-car
  #6:     ford     3  multi-car

这是一个基本的 R 可能性

tab <- tabulate(df$owner)
cbind(df, type = rep(ifelse(tab == 1L, "onecar", "multicar"), tab))
#   car_manu owner     type
# 1     ford     1 multicar
# 2   toyota     1 multicar
# 3     ford     2   onecar
# 4     ford     3 multicar
# 5     ford     3 multicar
# 6     ford     3 multicar

哪里

df <- structure(list(car_manu = structure(c(1L, 2L, 1L, 1L, 1L, 1L), .Label = c("ford", 
"toyota"), class = "factor"), owner = c(1L, 1L, 2L, 3L, 3L, 3L
)), .Names = c("car_manu", "owner"), class = "data.frame", row.names = c(NA, 
-6L))

简单基础R

d$type<-apply(d,1,function(x){length(which(d$owner==x[2]))})

由于我正在学习 R,这可能不是最有效的方法之一,但易于使用和理解。