我正在尝试使用tidyverse逻辑对具有级联标准的数据帧进行分类(我正在尝试学习它(。我可以用 base R 来做,但不能用 tidyverse 来做——我找到了一些使用混合方法 tidyverse+base r(使用子集(的例子,但找不到/理解如何仅使用 dplyr/tidyverse 语法(过滤器、突变(。
问题是,在第一个标准(使用过滤器(的子集化之后,数据帧仅包含过滤后的行,我无法应用其余条件进行子集和分类。我可能可以使用临时的 df 和 rbind((,但我认为可能有一种更优雅的方法可以只使用整洁的语法来做到这一点。简而言之,我只想更新符合我的条件的行,而所有其他行在原始 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
一种选择是将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,您可以:
1 - 将"中断"设置为"字段 1"及其"标签"。
breaks <- c(-Inf, 200, 300)
labels <- c("type1", "type2)
2- 做:
df <- df %>% mutate(category=cut(field1, breaks= breaks, labels= labels))