我有一个数据帧,其中一列(x1)包含字符串值。我使用这些字符串值修改数据帧中其他列的相应逻辑值(其他列以列x1的字符串中可能的子字符串值命名,即“Dog”、“Cat”、“Bird”)。
我已经弄清楚了如何使用str裂()来解析x1列中的每个字符串。我还知道如何根据这些str裂()结果改变/修改其他三列。
我目前坚持的是如何将下面的for循环应用于我的数据帧中的每一行。
x0 <- c(1,2,3,4,5)
x1 <- c("Dog, Cat", "Cat", "Dog, Bird", "Cat, Bird, Dog", "Cat, Bird")
Dog <- c(rep(FALSE, 5))
Cat <- c(rep(FALSE, 5))
Bird <- c(rep(FALSE, 5))
example_df <- data.frame(x0, x1, Dog, Cat, Bird)
for(i in 1:length(strsplit(example_df$x1) )){
example_df[[strsplit(example_df$x1)[i]]] <- TRUE
}
因此,对于上面的示例,我希望我的代码将数据帧的第一行更改为example_df$Dog和example_df$Cat都为TRUE,但example_df$Bird对于该行仍然为FALSE。第二行只会example_df$Cat为TRUE,等等。
另请注意:对于上面的示例,我只提供了三个动物字符串值。但我正在寻找一种方法,它可以对大量字符串值进行适当的扩展。我知道可以通过这种方法使用复制和粘贴:
example_df %>%
mutate(Dog = str_contains(x1, "Dog"))
但不幸的是,如果我在x1列中有10或20个可能的动物子字符串值,则此方法不会很好地扩展。
我们可以在str拆分
之后使用mtable
library(qdapTools)
m1 <- mtabulate(strsplit(example_df$x1, ",\\s+")) > 0
example_df[names(example_df)[3:5]] <- m1[, names(example_df)[3:5]]
-输出
example_df
# x0 x1 Dog Cat Bird
#1 1 Dog, Cat TRUE TRUE FALSE
#2 2 Cat FALSE TRUE FALSE
#3 3 Dog, Bird TRUE FALSE TRUE
#4 4 Cat, Bird, Dog TRUE TRUE TRUE
#5 5 Cat, Bird FALSE TRUE TRUE
或者另一个选项是
library(splitstackshape)
cSplit_e(example_df[1:2], "x1", sep = ",", type = "character", fill = 0, drop = TRUE)
根据你的例子调整这个答案。你可以使用separate_rows
然后pivot_wider
。
library(tidyverse)
example_df %>%
select(x0, x1) %>%
separate_rows(x1) %>%
pivot_wider(names_from = x1,
values_from = x1,
values_fn = list(x1 = is.character),
values_fill = list(x1 = FALSE))
#----------
# A tibble: 5 x 4
x0 Dog Cat Bird
<dbl> <lgl> <lgl> <lgl>
1 1 TRUE TRUE FALSE
2 2 FALSE TRUE FALSE
3 3 TRUE FALSE TRUE
4 4 TRUE TRUE TRUE
5 5 FALSE TRUE TRUE
我试图遍历每个数字索引,并过滤所述索引中excepted_words的任何实例。这个程序的输出似乎几乎没有修改,如果有的话。我该怎么解决这个问题? 输出:
问题内容: 如何遍历Java中的字符串? 我正在尝试使用foreach样式进行循环 问题答案: 如果要使用增强循环,可以将字符串转换为charArray
我有一个文本包含一些我想要标记的单词,要标记的单词包含在一个列表中。问题是其中一些单词是其他单词的子字符串,但我想从列表中标记最长的可识别字符串。 例如,如果我的文本是“foo和bar不同于foo bar。”我的列表包含“foo”、“bar”和“foo bar”,结果应该是“[tag]foo[/tag]和[tag]bar[/tag]不同于[tag]foo bar[/tag]。”
问题内容: 例如: 上面的代码不执行任何操作,因为条件不是通过引用获得的。正确的方法是什么? 问题答案: 您可以使用: 但是,总的来说,这些东西在使用辅助函数和列表理解时会更加干净: 应该注意的是,第二种解决方案不会适当地更新列表-换句话说,如果您对此列表有其他引用,则它们不会受到影响。如果需要,可以使用切片分配很容易地进行替换:
列表(lst):[快速,棕色,狐狸,跳跃,越过,懒惰,狗] 我正在尝试返回最短单词的集合。(狗,狐狸,the) 我通过扫描文本文档实现了这一点,但我必须先将其转换为列表,以删除不必要的标点符号和数字。但我犯了一个错误,所以现在我需要遍历列表而不是文件。 这是我的老逻辑:
问题内容: 我想遍历s1以确保s1中的每个字符都包含在s2中。 问题答案: