标签: stringr

str_extract_all 返回一个列表,但我想要一个向量

对于 R 来说还是比较新的。我有一列推文,我正在尝试创建一个包含转发句柄“RT @blahblah”的列,如下所示:

Tweets                            Retweetfrom
RT @john I had a good day         RT @john
RT @josh I had a bad day          RT @josh
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

r$Retweetfrom <- str_extract_all(r$Tweets, "^RT[:space:]+@[:graph:]+")
Run Code Online (Sandbox Code Playgroud)

它给了我正确的结果,但新列不是向量,而是列表。当我尝试取消列出它时,它会抛出一个错误:

Error in `$<-.data.frame`(`*tmp*`, "Retweetfrom", value = c("@AlpineITW", "@AllScienceGlobe",  : replacement has 1168 rows, data has 2306
Run Code Online (Sandbox Code Playgroud)

有人知道如何处理这个问题吗?多谢。

r stringr

5
推荐指数
1
解决办法
3546
查看次数

使用 ISO-8859-1 编码而不是 UTF-8 导出 csv

我在 csv 导出中的编码方面遇到了困难。我来自荷兰,我们使用相当多的 Trema(例如\xc3\xab, \xc3\xaf)和重音符号(例如\xc3\xa9, \xc3\xb3)等。这会在导出到 csv 并在 Excel 中打开文件时出现问题。

\n\n

在 macOS Mojave 上。

\n\n

我已经尝试了多种编码功能,如下所示。

\n\n
library(stringr)\nlibrary(readr)\n\ntest <- c("Argentini\xc3\xab", "Belgi\xc3\xab", "Ha\xc3\xafti")\n\ntest %>%\n  stringi::stri_conv(., "UTF-8", "ISO-8859-1") %>%\n  write.csv2("~/Downloads/test.csv")\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这仍然会导致奇怪的字符:

\n\n

在此输入图像描述

\n

r character-encoding stringr

5
推荐指数
1
解决办法
2万
查看次数

`stringr` 仅将数据框中的第一个字母转换为大写

我想将列中每个单词的第一个字母大写,而不将其余字母转换为小写。我正在尝试使用它,stringr因为它是矢量化的并且可以很好地与数据帧配合使用,但也会使用另一种解决方案。下面是一个表示,显示了我想要的输出和各种尝试。我只能选择第一个字母,但不知道如何将其大写。感谢您的帮助!

我还查看了相关帖子,但不确定如何在我的案例中应用这些解决方案(即在数据框中):

第一个字母改为大写

将双字字符串中两个单词的第一个字母大写

library(dplyr)
library(stringr)

words <-
  tribble(
    ~word, ~number,
    "problems", 99,
    "Answer", 42,
    "golden ratio", 1.61,
    "NOTHING", 0
  )

# Desired output
new_words <-
  tribble(
    ~word, ~number,
    "Problems", 99,
    "Answer", 42,
    "Golden Ratio", 1.61,
    "NOTHING", 0
  )

# Converts first letter of each word to upper and all other to lower
mutate(words, word = str_to_title(word))
#> # A tibble: 4 x 2
#>   word         number
#>   <chr>         <dbl>
#> 1 Problems      99   
#> 2 Answer        42 …
Run Code Online (Sandbox Code Playgroud)

string r uppercase stringr

5
推荐指数
1
解决办法
3718
查看次数

将多个函数放入单个 dplyr 中,对所有内容进行变异,例如更改多个不同的字符串

示例数据:

df1 = data.frame(x1 = rep(c("foo", "bar"), 4),
                 x2 = rep(c("FOO", "fix", "broke", "fix"), 2))
Run Code Online (Sandbox Code Playgroud)

例如,我想更改多个不同的字符串,在本例中更改foodone和。我正在使用和。是否可以在 后面放置多个函数,以便在同一行代码中的所有列上运行多个函数,而不是像上面重复和的示例那样:baropenstringrdplyr~acrosseverything

> df1%>%
+   mutate(across(everything(), ~ str_replace(.,"(?i)bar", "open")),
+          across(everything(), ~ str_replace(., "(?i)foo", "done")))
    x1    x2
1 done  done
2 open   fix
3 done broke
4 open   fix
5 done  done
6 open   fix
7 done broke
8 open   fix
Run Code Online (Sandbox Code Playgroud)

r function stringr dplyr

5
推荐指数
1
解决办法
2034
查看次数

在 R 中将完整年龄从字符转换为数字

我有一个数据集,其中人们的完整年龄为 R 中的字符串(例如,“10 年 8 个月 23 天)”,我需要将其转换为有意义的数字变量。我正在考虑将其转换为有多少天人的年龄(这很困难,因为月份有不同的天数)。因此,最好的解决方案可能是创建一个双变量,将年龄显示为 10.6 或 10.8,一些数字变量携带 10 年 8 个月 5 天大于的信息10年7月12天。

这是我当前变量的示例

library(tibble)

age <- tibble(complete_age = 
             c("10 years 8 months 23 days",
               "9 years 11 months 7 days",
               "11 years 3 months 1 day",
               "8 years 6 months 12 days")) 

age

# A tibble: 4 x 1
  complete_age             
  <chr>                    
1 10 years 8 months 23 days
2 9 years 11 months 7 days 
3 11 years 3 months 1 day  
4 8 years …
Run Code Online (Sandbox Code Playgroud)

r lubridate stringr data-cleaning data-wrangling

5
推荐指数
1
解决办法
905
查看次数

使用单独的方法仅考虑 R 中的第一个点来拆分列

这是我的数据框:

df <- tibble(col1 = c("1. word","2. word","3. word","4. word","5. N. word","6. word","7. word","8. word"))
Run Code Online (Sandbox Code Playgroud)

我需要使用单独的函数分成两列,并将它们重命名为Numbers和 其他称为Words. 我已经这样做了,但它不起作用:

df %>% separate(col = col1 , into = c('Number','Words'), sep = "^. ")
Run Code Online (Sandbox Code Playgroud)

问题是第五个有 2 个点。我不知道如何处理有关正则表达式的问题。

有什么帮助吗?

r stringr tidyr

5
推荐指数
1
解决办法
491
查看次数

在 dplyr 中使用 R 中的 str_detect 和 case_when

这是我的 df:

mydf <- structure(list(Action = c("Passes accurate", "Passes accurate", 
"Passes accurate", "Passes accurate", "Lost balls", "Lost balls (in opp. half)", 
"Passes (inaccurate)", "Interceptions (in opp. half)", "Interceptions", 
"Positional attacks")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

我有这个向量:passes <- c('Passes','passes','Assists','Crosses')

我正在尝试这样做:mydf %>% mutate(newcol = case_when(str_detect(Action, passes) ~ 'passes'))

但我只有第一行充满了passes. 例如,我应该将前 4 行填充为passes. 还有第七排。我怎样才能用case_when函数来实现这一点?

r stringr dplyr

5
推荐指数
1
解决办法
1548
查看次数

如何在 R 中的向量中有条件地添加 NA 值?

假设我的数据是df <- c("Author1","Reference1","Abstract1","Author2","Reference2","Abstract2","Author3","Reference3","Author4","Reference4","Abstract4").

这是一个系列,顺序为作者、参考文献和摘要。但在某些情况下,摘要数据会丢失。(在此示例中,缺少第三个摘要。)那么,当摘要丢失时,如何添加 NA 值来代替摘要呢?

换句话说,如果向量中的一个元素以单词“Reference”开头,但其下一个元素不以单词“Abstract”开头,我想在以“Reference”开头的元素后面添加一个 NA 值。结果向量应该是 result <- c("Author1","Reference1","Abstract1","Author2","Reference2","Abstract2","Author3","Reference3",NA,"Author4","Reference4","Abstract4") How can I do it?

我已经尝试过 R 中的追加函数,但是为了使用它,我需要有要添加 NA 的元素的索引号。因此,每个 NA 元素都需要手动输入。

r stringr

5
推荐指数
1
解决办法
110
查看次数

删除其他两个字符之间的所有字符(保留其他字符)

我知道这个问题已经以不同的方式被问过多次,但我找不到一个解决方案,可以在保留边框的同时替换一些“边框”之间的文本。

input <- "this is my 'example'"
change <- "test"
Run Code Online (Sandbox Code Playgroud)

现在我想用 中的值替换单引号之间的所有内容change

预期输出为"this is my 'test'

我尝试了不同的变体:

stringr::str_replace(input, "['].*", change)
Run Code Online (Sandbox Code Playgroud)

但这不起作用。例如上面给出的是"this is my test",所以它不再有单引号。

有任何想法吗?

regex r stringr

5
推荐指数
1
解决办法
157
查看次数

R 正则表达式用于积极环顾以匹配以下内容

我在 R 中有一个数据框。我想匹配并保留该行,如果

  • “女人”是第一个或
  • 句子中的第二个单词,或
  • 如果它是句子中的第三个单词,并且前面有“不”、“不”或“从不”等词。
phrases_with_woman <- structure(list(phrase = c("woman get degree", "woman obtain justice", 
"session woman vote for member", "woman have to end", "woman have no existence", 
"woman lose right", "woman be much", "woman mix at dance", "woman vote as member", 
"woman have power", "woman act only", "she be woman", "no committee woman passed vote")), row.names = c(NA, 
-13L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我希望能够匹配除“she be Woman”之外的所有行。

这是我到目前为止的代码。我有一个积极的环视((?<=woman\\s)\\w+"),似乎在正确的轨道上,但它与太多前面的单词匹配。我尝试使用{1}仅匹配前面的一个单词,但这种语法不起作用。

matches <- phrases_with_woman %>%
  filter(str_detect(phrase, "^woman|(?<=woman\\s)\\w+")) 
Run Code Online (Sandbox Code Playgroud)

感谢帮助。

regex r stringr regex-lookarounds

5
推荐指数
1
解决办法
68
查看次数