仅当字符串位于 R 中字符串的开头时才从多列中删除字符串
Remove string from multiple columns only if it is at the start of a string in R
我有一个数据框,其中包含许多名为 fact 的列(在此示例中为 fact1、fact2 和 fact3),这些列具有字符。它们都以 old_ 开头,我想删除它。我的真实数据集有很多列,所以我不想对每一列都进行处理。我在这里 Getting and removing the first character of a string 看到了一个解决方案,但是当我尝试应用它时,出现错误。
library(tidyverse)
problem <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("old_song_yes", "old_dance_no"), fact2 = c("old_bold_yes", "old_shy_no"), fact3 = c("old_cold_yes", "old_young_yes"))
这是我的解决方案,但它的错误消息不起作用:
apply(problem, substring(problem, 5, nchar(problem)))
Error in match.fun(FUN) : argument "FUN" is missing, with no default
重要的是它只删除开头的字符串;否则,例如,在 fact3 列中,它将看起来像 "cyes" 而不是 "cold_yes".
最后,如果有帮助,我在此处添加了我希望最终产品看起来像的内容:
library(tidyverse)
solution <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("song_yes", "dance_no"), fact2 = c("bold_yes", "shy_no"), fact3 = c("cold_yes", "young_yes"))
如果您有一个简洁的解决方案或只涉及事实列的解决方案,我将特别感激,谢谢!
一个 dplyr
可能性是:
problem %>%
mutate_at(vars(starts_with("fact")), list(~ sub("^old_", "\1", .)))
name height weight fact1 fact2 fact3
<chr> <dbl> <dbl> <chr> <chr> <chr>
1 Random 48 95 song_yes bold_yes cold_yes
2 Silly 50 102 dance_no shy_no young_yes
或者:
problem %>%
mutate_at(vars(starts_with("fact")), list(~ substr(., 5, nchar(.))))
我们可以直接用gsub
.
problem[] <- Map(gsub, "^old_", "", problem)
problem
# name height weight fact1 fact2 fact3
# 1 Random 48 95 song_yes bold_yes cold_yes
# 2 Silly 50 102 dance_no shy_no young_yes
我有一个数据框,其中包含许多名为 fact 的列(在此示例中为 fact1、fact2 和 fact3),这些列具有字符。它们都以 old_ 开头,我想删除它。我的真实数据集有很多列,所以我不想对每一列都进行处理。我在这里 Getting and removing the first character of a string 看到了一个解决方案,但是当我尝试应用它时,出现错误。
library(tidyverse)
problem <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("old_song_yes", "old_dance_no"), fact2 = c("old_bold_yes", "old_shy_no"), fact3 = c("old_cold_yes", "old_young_yes"))
这是我的解决方案,但它的错误消息不起作用:
apply(problem, substring(problem, 5, nchar(problem)))
Error in match.fun(FUN) : argument "FUN" is missing, with no default
重要的是它只删除开头的字符串;否则,例如,在 fact3 列中,它将看起来像 "cyes" 而不是 "cold_yes".
最后,如果有帮助,我在此处添加了我希望最终产品看起来像的内容:
library(tidyverse)
solution <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("song_yes", "dance_no"), fact2 = c("bold_yes", "shy_no"), fact3 = c("cold_yes", "young_yes"))
如果您有一个简洁的解决方案或只涉及事实列的解决方案,我将特别感激,谢谢!
一个 dplyr
可能性是:
problem %>%
mutate_at(vars(starts_with("fact")), list(~ sub("^old_", "\1", .)))
name height weight fact1 fact2 fact3
<chr> <dbl> <dbl> <chr> <chr> <chr>
1 Random 48 95 song_yes bold_yes cold_yes
2 Silly 50 102 dance_no shy_no young_yes
或者:
problem %>%
mutate_at(vars(starts_with("fact")), list(~ substr(., 5, nchar(.))))
我们可以直接用gsub
.
problem[] <- Map(gsub, "^old_", "", problem)
problem
# name height weight fact1 fact2 fact3
# 1 Random 48 95 song_yes bold_yes cold_yes
# 2 Silly 50 102 dance_no shy_no young_yes