优雅的方式,如果else语句的多组

这里是我想要做的事:优雅的方式,如果else语句的多组

创建分配样本秩,以行的多个子集的新列基于有多少行是每个子集。分组变量是“层”列。

我通常使用嵌套ifelse语句随机分配排名,如下所示。有时候这样做足够了,但最近我一直在处理越来越多的分组。 40个嵌套ifelse语句可能开始看起来有点过分。

是否有一个更优雅/更快/最简单的代码方式来使用dplyr或data.table,可能与apply,lapply,sapply等结合使用?

我试图使用data.table语句,但我不知道如何使用nrow插入示例函数。

重现数据:

dta <- data.frame(

uniqueID = c(950513, 951634, 951640, 951641,951646, 952732, 952895, 952909, 952910, 952911, 952912,952923, 952924, 952925, 952926, 952927, 952928L, 952933,

952934, 952935),

stratum = c("group9","group6","group15","group13","group9","group8","group9","group15","group15","group15","group15", "group13", "group13",

"group1", "group1", "group1", "group1", "group1", "group1", "group1")

)

下面是我通常会指派一个随机等级,使用netsed ifelse声明:

dta<- dta[order(dta$stratum),] 

set.seed(7265)

dta$rank <- ifelse(dta$stratum== "group1",sample(1:nrow(dta[dta$stratum== "group1",])),

ifelse(dta$stratum=="group6",sample(1:nrow(dta[dta$stratum== "group6",])),

ifelse(dta$stratum=="group8",sample(1:nrow(dta[dta$stratum== "group8",])),

ifelse(dta$stratum=="group9",sample(1:nrow(dta[dta$stratum== "group9",])),

ifelse(dta$stratum=="group13",sample(1:nrow(dta[dta$stratum== "group13",])),

ifelse(dta$stratum=="group15",sample(1:nrow(dta[dta$stratum== "group15",])),

0))))))

回答:

使用data.table解决方案:

library(data.table) 

setDT(dta)[, rank := sample(1:.N), stratum]

# uniqueID stratum rank

# 1: 952925 group1 4

# 2: 952926 group1 2

# 3: 952927 group1 1

# 4: 952928 group1 6

# 5: 952933 group1 7

# 6: 952934 group1 3

# 7: 952935 group1 5

# 8: 951641 group13 2

# 9: 952923 group13 1

# 10: 952924 group13 3

# ...

说明:

  1. 从1 Transform对象为data.tablesetDT()
  2. 样品每组(, stratum])军衔.N(有多少行是每个组中)

回答:

使用dplyr,你可以做

library(dplyr) 

dta %>%

group_by(stratum) %>%

mutate(rank=sample.int(n()))

group_by允许你在一次行的一个子集进行操作,我们使用内置0从dplyr获取函数以获取每组中的行数。我选择使用效率更高的sample.int而不是sample,但它基本上做同样的事情。

在一般情况下,嵌套的if-else语句与case_when()dplyr更好地处理,但你在这种情况下,正在做什么用group_by()

回答:

是更好地处理考虑基础R的by,旨在通过因子分裂dataframes( s):

dta$rank <- unlist(by(dta, dta$stratum, FUN=function(df) sample(1:nrow(df)))) 

# uniqueID stratum rank

# 14 952925 group1 6

# 15 952926 group1 2

# 16 952927 group1 1

# 17 952928 group1 3

# 18 952933 group1 5

# 19 952934 group1 7

# 20 952935 group1 4

# 4 951641 group13 2

# 12 952923 group13 1

# 13 952924 group13 3

# 3 951640 group15 1

# 8 952909 group15 3

# 9 952910 group15 5

# 10 952911 group15 2

# 11 952912 group15 4

# 2 951634 group6 1

# 6 952732 group8 1

# 1 950513 group9 2

# 5 951646 group9 1

# 7 952895 group9 3

以上是 优雅的方式,如果else语句的多组 的全部内容, 来源链接: utcz.com/qa/267078.html

回到顶部