说我有数据集
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
答案 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
的数据框,您可以使用ifelse
和ave
函数,如下所示:
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
时,这可能不是最有效的方法之一,但易于使用和理解。