使用过滤器/变异和 dplyr/tidyverse 逻辑对数据库进行分类[重复]

Posted

技术标签:

【中文标题】使用过滤器/变异和 dplyr/tidyverse 逻辑对数据库进行分类[重复]【英文标题】:Classifying a database with filter/mutate and dplyr/tidyverse logic [duplicate] 【发布时间】:2018-12-08 00:45:10 【问题描述】:

我正在尝试使用 tidyverse 逻辑对具有级联标准的数据框进行分类(我正在尝试学习它)。我可以用 base R 来做,但不能用 tidyverse 来做——我发现了一些使用混合方法 tidyverse+base r(使用子集)的例子,但无法找到/理解如何仅使用 dplyr/tidyverse 语法来做到这一点(过滤,变异)。

问题在于,在对第一个标准(使用过滤器)进行子集化之后,数据框仅包含过滤后的行,我无法应用剩余的标准进行子集化和分类。我可能可以使用临时的 df 和 rbind() 但我认为可能有一种更优雅的方法可以只使用 tidyverse 语法来做到这一点。简而言之,我只想更新符合我的条件的行,而原始 DF 中的所有其他行都保持不变。我应该使用 dplyr 语法来做到这一点。这可能吗?

# with base R
    mydata$mytype = "NA"
    mydata$mytype[which(mydata$field1 > 300)] = "type1"
    mydata$mytype[which(mydata$field1 <= 300 & mydata$field1 > 200)] = "type2"

# with dplyr/tidyverse?
    library(tidyverse)
    mydata<-mydata%>% mutate(mytype = "NA")
    mydata<-mydata%>%filter(field1>300) %>% mutate(mytype="type1") 
    mydata<-mydata%>%filter(field1 >200, field1<=300) %>% mutate(mytype="type2")  #0 rows now

【问题讨论】:

您知道dplyr 中的case_when 函数吗?见?dplyr::case_when case_when 工作得很好!谢谢 【参考方案1】:

一种选择是使用cut

df$mytype  <- cut(df$field1, breaks = c(-Inf,201,301,+Inf), 
                        labels = c("NA", "Type2", "Type1"))

因为,OP 没有提供任何数据,因此,在向量上尝试上述解决方案:

cut(c(100, 190, 250, 260, 310), breaks = c(-Inf,201,301,+Inf), 
                labels = c("NA", "Type2", "Type1"))
#[1] NA    NA    Type2 Type2 Type1
#Levels: NA Type2 Type1

【讨论】:

谢谢,这是另一种选择。由于我正在学习 dplyr,我想了解如何仅更新与我的条件匹配的行 - 通过 dplyr 语法 - 而原始 df 中的所有其他行都保持不变。不知道有没有可能【参考方案2】:

使用 dplyr,您可以:

1 - 将“breaks”设置为“field1”及其“标签”。

breaks <- c(-Inf, 200, 300)

labels <- c("type1", "type2)

2- 做:

df <- df %>% mutate(category=cut(field1, breaks= breaks, labels= labels))

【讨论】:

以上是关于使用过滤器/变异和 dplyr/tidyverse 逻辑对数据库进行分类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

immutable.js 过滤和变异(删除)找到的条目

如何纠正 R 函数中的变异和过滤错误

Top_n 返回最大值和最小值 - R

js数组方法之数组变异方法

欲练神功,必先得到VCF—变异信息提取(call SNP pipeline)1

VCF变异统计及绘制染色体分布图