当前位置: 首页 > 知识库问答 >
问题:

如何遍历一列的字符串以变异/修改其他列的值?

史高阳
2023-03-14

我有一个数据帧,其中一列(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个可能的动物子字符串值,则此方法不会很好地扩展。

共有2个答案

闻华容
2023-03-14

我们可以在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)
曹浩波
2023-03-14

根据你的例子调整这个答案。你可以使用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中。 问题答案: