我有一个包含来自世界各地的参与者的大型数据集。其中一些参与者使用点/句号/逗号输入数据来表示千位分隔符,但 R 将它们读取为逗号,这完全扭曲了我的数据......例如 1234 变成 1,234。
我想删除所有点/句号/逗号。我的数据完全由完整数字组成,因此任何地方都不应该有任何小数。
我尝试使用 stringr,但不太明白。这是一个(我希望)可重现的示例,其中包含我的数据的一小部分样本:
structure(
list(
chnb = c(10L, 35L, 55L),
B1_1_77 = c(117.586,
4022, 4.921),
C1_1_88 = c(NA, 2206, 1.111),
C1_1_99 = c(6.172,
1884, 0),
C1_3_99 = c(5.62, 129, 0)
),
row.names = c(NA,-3L),
class = c("tbl_df",
"tbl", "data.frame")
)
Run Code Online (Sandbox Code Playgroud)
我试过这个:
prob1 <- prob %>% str_replace_all('\\.', '')
Run Code Online (Sandbox Code Playgroud)
这给了我这个:
> prob
[1] "c(10, 35, 55)" "c(117586, 4022, 4921)" "c(NA, 2206, 1111)"
[4] "c(6172, 1884, 0)" "c(562, 129, 0)"
Run Code Online (Sandbox Code Playgroud)
它确实删除了这些点,但它给了我一个简单的列表,并且完全丢失了我的数据结构。在线搜索建议我这样做:
prob1 <- prob %>% mutate_all(list(str_replace(., '\\.', …Run Code Online (Sandbox Code Playgroud) 我想从 R 中的字符串中删除多个单词,但想使用字符向量而不是正则表达式。
例如,如果我有字符串
"hello how are you"
Run Code Online (Sandbox Code Playgroud)
并想删除
c("hello", "how")
Run Code Online (Sandbox Code Playgroud)
我会回来
" are you"
Run Code Online (Sandbox Code Playgroud)
我可以近距离接触str_remove()来自stringr
"hello how are you" %>% str_remove(c("hello","how"))
[1] "how are you" "hello are you"
Run Code Online (Sandbox Code Playgroud)
但我需要做一些事情来将其分解为一个字符串。是否有一个函数可以一次调用完成所有这些操作?
假设我想在字符串中找到一个模式,如果该模式存在,那么我只保留该模式之前的字符串部分。我的问题是,如果模式不存在,那么它会返回NA,最终结果将是NA. 我希望它在模式不存在时返回原始字符串。
library(stringr)
library(dplyr)
unique(iris$Species)
#> [1] setosa versicolor virginica
#> Levels: setosa versicolor virginica
test <- iris %>%
mutate(Species = str_sub(Species, 1, str_locate(Species, "t")[,1] ))
head(test)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5.1 3.5 1.4 0.2 set
#> 2 4.9 3.0 1.4 0.2 set
#> 3 4.7 3.2 1.3 0.2 set
#> 4 4.6 3.1 1.5 0.2 set
#> 5 5.0 3.6 1.4 0.2 set
#> 6 5.4 3.9 1.7 0.4 set
tail(test) …Run Code Online (Sandbox Code Playgroud) 我有这样的文字:
text = 'I love apple, pear, grape and peach'
Run Code Online (Sandbox Code Playgroud)
如果我想知道文本是否包含apple或pear。我可以执行以下操作并且工作正常:
str_detect(text,"apple|pear")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我想像这样使用布尔值怎么办(apple OR pear) AND (grape)。无论如何我可以把它放进去str_detect()。那可能吗?以下是不工作:
str_detect(text,"(apple|pear) & (grape)" )
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
我想知道这一点的原因是我想编程以将“布尔查询”转换为grepor str_detect。就像是:
str_detect(text, '(word1|word2) AND (word2|word3|word4) AND (word5|word6) AND .....')
Run Code Online (Sandbox Code Playgroud)
数量AND不一....
请没有多个解决方案str_detect。
我在 R 中有一个...使用 tidyeval 的简单函数。是否可以将这些更改为字符串?
simple_paste <- function(...){
my_vars <- enquos(...)
paste(..., sep = "_x_")
}
Run Code Online (Sandbox Code Playgroud)
simple_paste(hello, world)
作为输出,我想得到"hello_x_world". 我也可以考虑使用glue函数 orstr_c代替paste,尽管我不确定这会更好。
我有这个字符串:
[1] "19980213" "19980214" "19980215" "19980216" "19980217" "iffi" "geometry"
[8] "date_consid"
Run Code Online (Sandbox Code Playgroud)
我想匹配所有不是日期而不是“date_consid”的元素。我试过
res = grep("(?!\\d{8})|(?!date_consid)", vec, value=T)
Run Code Online (Sandbox Code Playgroud)
但我就是不能让它工作......
我正在尝试清理来自许多不同组的样本信息表,因此我关心的治疗信息可能位于任意数量的不同列中。这是一个抽象的例子:
sample_info = tribble(
~id, ~could_be_here, ~or_here, ~or_even_in_this_one,
1, NA, "not_me", "find_me_other_stuff",
2, "Extra_Find_Me", NA, "diff_stuff",
3, NA, "Find_me", NA,
4, NA, "not_here", "not_here_either"
)
Run Code Online (Sandbox Code Playgroud)
我想在哪里找到“find_me”1)不区分大小写,2)它可以在任何列中,3)它可以作为更大字符串的一部分。我想创建一列,判断是否在任何列中找到“find_me”,该列为 TRUE 或 FALSE。我怎样才能做到这一点?(我想过对unite所有列进行 ing,然后str_detect在混乱的情况下运行 a,但一定有一种不那么老套的方法,对吧?)
需要明确的是,我想要一个相当于 的最终小标题sample_info %>% mutate(find_me = c(TRUE, TRUE, TRUE, FALSE))。
我希望在下面链接的类似情况下使用类似的东西stringr::str_detect(., regex('find_me', ignore_case = T)),pmap_lgl(any(c(...) <insert logic check>))但我不确定如何将它们组合成一个兼容变异的语句。
我查看过的内容:
按行操作查看是否有任何列位于任何其他列表中
我的数据框是:
df <- data.frame(player = c("Taiwo Awoniyi/e5478b87", "Jacob Bruun Larsen/4e204552", "Andi Zeqiri/d01231f0"), goals = c(2,5,7))
Run Code Online (Sandbox Code Playgroud)
我想删除“玩家”列中“/”后面的所有数字。理想情况下拥有:
df <- data.frame(player = c("Taiwo Awoniyi", "Jacob Bruun Larsen", "Andi Zeqiri"), goals = c(2,5,7))
Run Code Online (Sandbox Code Playgroud)
我不确定如何解决这个问题,因为玩家姓名的长度差异很大,而且有些数字比其他数字大。
我试图检测字符串是否以提供的字符串开头(用 | 分隔)
name = "KKSWAP"
stringr::str_starts(name, "RTT|SWAP")
Run Code Online (Sandbox Code Playgroud)
返回 TRUE,但是
str_starts(name, "SWAP|RTT")
Run Code Online (Sandbox Code Playgroud)
返回假
这种行为似乎是错误的,因为 KKSWAP 不是以“RTT”或“SWAP”开头。我希望在上述两种情况下这都是错误的。
我想根据匹配检查列表中的相邻元素。例如,在随机排序的字母列表中,我想知道 的相邻字母是什么m。我当前的解决方案是:
library(stringr)
ltrs <- sample(letters)
ltrs[(str_which(ltrs,'m')-2):(str_which(ltrs,'m')+2)]
[1] "j" "f" "m" "q" "a"
Run Code Online (Sandbox Code Playgroud)
对我来说,重复str_which()感觉没有必要。有没有更简单的方法来达到相同的结果?