根据条件对独特的观察进行编码
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
的数据框,您可以使用 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
这是一个基本的 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
,这可能不是最有效的方法之一,但易于使用和理解。
假设我有一个数据集
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
的数据框,您可以使用 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
这是一个基本的 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
,这可能不是最有效的方法之一,但易于使用和理解。