【问题标题】:grepl across multiple, specified columns跨多个指定列的 grepl
【发布时间】:2017-12-22 12:36:30
【问题描述】:

我想在我的数据框中创建一个新列,该列是 TRUE 还是 FALSE,具体取决于术语是否出现在两个指定的列中。 这是一些示例数据:

AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO')
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA')
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3')
M  <- data.frame(AB,TI,AU)

我可以为一列或另一列执行此操作,但我不知道如何为这两个列执行此操作。换句话说,我不知道如何组合这两条不会相互覆盖的行。

M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=M$AB)
M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=M$TI)

我指定列很重要,我不能选择整个 data.frame。我已经寻找了其他类似的问题,但似乎没有一个适用于我的案例,而且我无法调整任何现有示例。这对我来说是有意义的:

M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=(M$AB|M$TI)

【问题讨论】:

  • 试试Map(grepl, "CHINA|CHINESE|SINO", M)
  • 我不确定 Map 的作用,但它给出了这个输出 $CHINA|CHINESE|SINO [1] TRUE FALSE FALSE $ [1] FALSE TRUE FALSE $ [1] FALSE假 假。它似乎在整个数据框上运行,也没有添加新列。
  • 它是list 格式。您可以通过包装 data.frame 将其转换为 data.frame 或将其分配给列 M[] &lt;- Map(grepl, "CHINA|CHINESE|SINO", M)
  • 在这种情况下,它会覆盖不应该发生的值。
  • 不清楚您的预期输出

标签: r grepl


【解决方案1】:

使用:

M$China <- !!rowSums(sapply(M[1:2], grepl, pattern = "CHINA|CHINESE|SINO"))

给予:

> M
                     AB                      TI       AU China
1 CHINAS PARTY CONGRESS AMERICAN FOREIGN POLICY AUTHOR 1  TRUE
2    JAPAN-US RELATIONS     CHINESE ATTEMPTS TO AUTHOR 2  TRUE
3        JAPAN TRIES TO         BRITAIN HAS TEA AUTHOR 3 FALSE

这是做什么的:

  • sapply(M[1:2], grepl, pattern = "CHINA|CHINESE|SINO") 循环遍历 ABTI 两列,并查看模式的一部分 ("CHINA|CHINESE|SINO") 是否存在。
  • sapply-调用返回一个由TRUE/FALSE 值组成的矩阵:

            AB    TI
    [1,]  TRUE FALSE
    [2,] FALSE  TRUE
    [3,] FALSE FALSE
    
  • 使用rowSums,您可以检查每行有多少个TRUE-值。

  • 通过在rowSums 前面添加!!,您可以将来自rowSums 调用的所有值转换为大于零的TRUE,并将所有爱神转换为FALSE

【讨论】:

  • 是的,这行得通!不完全理解,但我想在 M[1:2] 中我可以指定我想要的任何列号,也在我自己的 data.frame 中,不是吗?
  • @SCW 1:2 确实指定了列位置
  • 非常感谢!
  • @SCW 现在也添加了解释
【解决方案2】:

如果我们需要折叠为单个向量,请使用 Map 循环遍历列,应用 pattern 获取 listlogical 向量,然后将 Reduce 应用于 @987654326 @vector 使用|

M$China <- Reduce(`|`, Map(grepl, "CHINA|CHINESE|SINO", M))
M
#                     AB                      TI       AU China
#1 CHINAS PARTY CONGRESS AMERICAN FOREIGN POLICY AUTHOR 1  TRUE
#2    JAPAN-US RELATIONS     CHINESE ATTEMPTS TO AUTHOR 2  TRUE
#3        JAPAN TRIES TO         BRITAIN HAS TEA AUTHOR 3 FALSE

或者在tidyverse中使用相同的方法

library(tidyverse)
M %>%
   mutate_all(funs(str_detect(., "CHINA|CHINESE|SINO")))  %>% 
   reduce(`|`) %>%
   mutate(M, China = .)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多