如何更有效地在 R 中使用 stringr 和 forcats 包?
How to use stringr and forcats package in R more efficiently?
我很困惑如何在管道数据分析过程中组合 stringr
包。 stringr
项目是一个字符串向量(单列),原始数据(多列)转换为单列,输出不能直接用于后面的过程 %>%
for function like summarise
在dplyr
,又要重新分配到新的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
我很困惑如何在管道数据分析过程中组合 stringr
包。 stringr
项目是一个字符串向量(单列),原始数据(多列)转换为单列,输出不能直接用于后面的过程 %>%
for function like summarise
在dplyr
,又要重新分配到新的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