首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为多个组执行嵌套if way语句的优雅方法

为多个组执行嵌套if way语句的优雅方法
EN

Stack Overflow用户
提问于 2017-12-27 19:12:18
回答 3查看 951关注 0票数 1

以下是我要做的事:

创建一个新列,根据每个子集中有多少行,为多个行子集分配一个示例排序。分组变量是“分层”列。

我通常使用嵌套的ifelse语句随机分配等级,如下所示。有时这就足够了,但最近,我处理了越来越多的分组。40条嵌套的ifelse语句可能开始显得有点过火。

是否有一种更优雅/更快/更小的代码方法来使用dplyr或data.table,可能与apply、lapply、sapply等一起使用?

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

可复制的数据:

代码语言:javascript
复制
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语句指定随机秩:

代码语言:javascript
复制
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))))))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-27 19:16:48

使用data.table的解决方案

代码语言:javascript
复制
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. 将对象转换为data.table (setDT())
  2. 每组样本排名(, stratum])从1到.N (每个组中有多少行)
票数 1
EN

Stack Overflow用户

发布于 2017-12-27 19:17:44

使用dplyr,您可以

代码语言:javascript
复制
library(dplyr)
dta %>% 
    group_by(stratum) %>% 
    mutate(rank=sample.int(n()))

group_by允许您一次对一个行子集进行操作,我们使用来自dplyr的内置n()函数来获取每个组中的行数。我选择使用更高效的sample.int,而不是sample,但它基本上也是这样做的。

通常,在case_when()中使用dplyr更好地处理嵌套的if- you语句,但是在本例中您所做的是使用group_by()来处理。

票数 2
EN

Stack Overflow用户

发布于 2017-12-27 19:25:52

以R基的by为例,它被设计成按因子将数据分割:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47997443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档