如何更有效地在 R 中使用 stringr 和 forcats 包?

How to use stringr and forcats package in R more efficiently?

我很困惑如何在管道数据分析过程中组合 stringr 包。 stringr 项目是一个字符串向量(单列),原始数据(多列)转换为单列,输出不能直接用于后面的过程 %>% for function like summarisedplyr,又要重新分配到新的project,方法好像不太温和,有没有什么处理数据的方法比较流畅?

这是一个示例代码,str_replace 过程可以与 sum 过程结合使用管道 %>%

# prepare dara
library(tidyr, dplyr)
name <- c('D', 'E', 'F', 'G', 'd', 'e', 'f' )
room <- rep(c('A','B'),c(4,3))
goal <- c(rnorm(7,mean=60,sd=10))
test <- data.frame(name,goal,room)

# replace 'G' in name to 'H'
test$name <- str_replace(test$name, 'G', 'H') 

# SUM (calculate)
test %>% group_by(name) %>% summarise(sum(goal))

我只是想知道如何连接 stringr 与其他数据进程,可以吗?我知道它可以通过因子方式解决(forcats):将字符串向量更改为因子向量并重新调整因子,这是另一个问题:how to process partial factor vetor more gently,这是一个示例:

library(dplyr,forcats,dplyr)
name1 <- c('D', 'E', 'F', 'G', 'D', 'E', 'F' )
room <- rep(c('A','B'),c(4,3))
goal <- c(rnorm(7,mean=60,sd=10))
test1 <- data.frame(name1,goal,room)

## split and recombine the test1 data, I just want to change the name level of room B ##, but just change name directly in data test1 will change the level of room A at ##the same time
test1A <- test1 %>% filter(room == 'A') 
test1B <- test1 %>% filter(room == 'B') 
test1B %>% mutate(name1 = fct_recode(name1, 'DD'='D','EE'='E','FF'='F'))
test1 <- bind_rows(test1A, test1B) 

部分重新编码的目的能否更温和一些?

在管道中包含 stringr 代码与所有其他代码相同。你可以做 -

library(dplyr)
library(stringr)

test %>%
  group_by(name = str_replace(name, 'G', 'H')) %>%
  summarise(goal = sum(goal))

#  name   goal
#  <chr> <dbl>
#1 d      46.9
#2 D      57.4
#3 e      61.3
#4 E      61.5
#5 f      59.8
#6 F      67.2
#7 H      50.0

同样,对于forcats代码-

test1 %>% 
  filter(room == 'B') %>%
  mutate(name1 = fct_recode(name1, 'DD'='D','EE'='E','FF'='F')) %>%
  bind_rows(test1 %>% filter(room == 'A'))

我们可以使用base R

aggregate(goal ~ name, transform(test, chartr('G', 'H', name)), sum)

-输出

name     goal
1    d 55.97663
2    D 65.21457
3    e 76.83987
4    E 41.75801
5    f 49.27920
6    F 70.87190
7    G 58.63348