根据条件编码独特的观察

时间:2015-07-28 14:43:59

标签: r subset

说我有数据集

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

我想制作一个变量,说明他们是否是“一个车主” - 这意味着车主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

5 个答案:

答案 0 :(得分:3)

这是一个基础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))

答案 1 :(得分:2)

使用dplyr

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

答案 2 :(得分:1)

如果您需要使用&#39;所有者&#39;根据观察次数创建列。作为分组变量,我们可以使用data.table。我们更改了'data.frame&#39;到&#39; data.table&#39; (setDT(df1))。由所有者&#39;分组,我们检查条件if(.N==1)它将是一个车主&#39;或者多车&#39;并将输出分配给新列&lt; owner_type&#39;

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

或者,如果不使用if/else条件,我们可以通过&#39;所有者&#39;创建逻辑向量(.N!=1),向其添加1并将其用作数字索引来替换它使用“一车”,“多车”,

  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

答案 3 :(得分:0)

使用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

答案 4 :(得分:0)

简单的基础R

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

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