首页 > 解决方案 > filter_all 具有相对列位置(在任何列中过滤。然后在 n+2 列中)

问题描述

关于如何在 col 规范中用or表示n+2的简短问题。filter_allfilter

我需要搜索一个特定的值,两个列。离开,按特定值,而不使用 col。名字

数据

我有一个来自文本处理的df(在古法语中,顺便说一句)。每行代表一行文本。这是该 df 的摘录(简化)。它在上校之后继续。SYLL_TAG4-1 到 SYLL_TAG20。

   meter SYLL_TAG1 `SYLL_TAG1 -1` SYLL_TAG2 `SYLL_TAG2 -1` SYLL_TAG3 `SYLL_TAG3 -1` SYLL_TAG4 `SYLL_TAG4 -1` SYLL_TAG5 `SYLL_TAG5 -1`     
 1    11 jo        NA             më        NA             crend     NA             rei       NA             ë         NA            
 2    11 ë         NA             dit       NA             al        NA             cun       NA             të        NA            
 3    11 liv       NA             rez       NA             lë        NA             mei       NA             jo        NA            
 4    11 dist      NA             ar        NA             ce        NA             ves       NA             quë       NA            
 5    11 dë        NA             voz       NA             ma        NA             na        NA             ces       NA            
 6    11 mais      NA             u         NA             në        NA             cho       NA             së        NA            
 7    11 jo        NA             oi        NA             al        NA             cor       NA             ner       NA            
 8    11 si        re             a         NA             pιed      NA             es        NA             tes       NA            
 9    11 jo        NA             ai        NA             cun       NA             té        NA             i         NA            
10    11 est       NA             reu       NA             li        NA             tind      NA             rent      NA            
11    11 a         NA             ces       te             es        NA             pe        NA             ë         NA   

这是重现 df 的代码(对不起,冗长):

PAM_JO <- structure(list(meter = c(11, 11, 11, 11, 11, 11, 11, 11, 11, 
11, 11), SYLL_TAG1 = c("jo", "ë", "liv", "dist", "dë", "mais", 
"jo", "si", "jo", "est", "a"), `SYLL_TAG1 -1` = c("NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "re", "NA", "NA", "NA"), SYLL_TAG2 = c("më", 
"dit", "rez", "ar", "voz", "u", "oi", "a", "ai", "reu", "ces"
), `SYLL_TAG2 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "te"), SYLL_TAG3 = c("crend", "al", "lë", 
"ce", "ma", "në", "al", "pιed", "cun", "li", "es"), `SYLL_TAG3 -1` = c("NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"), 
    SYLL_TAG4 = c("rei", "cun", "mei", "ves", "na", "cho", "cor", 
    "es", "té", "tind", "pe"), `SYLL_TAG4 -1` = c("NA", "NA", 
    "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"), SYLL_TAG5 = c("ë", 
    "të", "jo", "quë", "ces", "së", "ner", "tes", "i", "rent", 
    "ë"), `SYLL_TAG5 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "NA"), SYLL_TAG6 = c("quë", "jo", 
    "en", "jo", "cul", "vos", "quë", "ë", "ad", "nei", "quë"
    ), `SYLL_TAG6 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "NA"), SYLL_TAG7 = c("vos", "në", 
    "fe", "i", "vert", "soi", "guai", "jo", "mais", "mes", "jo"
    ), `SYLL_TAG7 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "NA"), SYLL_TAG8 = c("vos", "vus", 
    "rai", "rai", "jo", "jo", "res", "sui", "quë", "ë", "ai"
    ), `SYLL_TAG8 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "NA"), SYLL_TAG9 = c("mes", "aim", 
    "la", "par", "ai", "ben", "në", "a", "sept", "jo", "cein"
    ), `SYLL_TAG9 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "te"), SYLL_TAG10 = c("li", "ni", 
    "jus", "mun", "es", "gua", "viv", "ce", "li", "ce", "i"), 
    `SYLL_TAG10 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA"), SYLL_TAG11 = c("sez", "ent", "ti", 
    "chef", "soign", "rant", "rat", "val", "we", "rans", "ci"
    ), `SYLL_TAG11 -1` = c("NA", "NA", "NA", "NA", "NA", "NA", 
    "NA", "NA", "NA", "NA", "NA"), SYLL_TAG12 = c("NA", "NA", 
    "ce", "NA", "NA", "NA", "NA", "NA", "es", "NA", "NA"), `SYLL_TAG12 -1` = c("NA", 
    "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"
    ), NUM_L = c(257, 306, 498, 799, 1232, 1520, 2106, 2136, 
    2757, 3111, 3830)), row.names = c(NA, -11L), class = c("tbl_df", 
"tbl", "data.frame"))

任务

我想找到与特定文本上下文匹配的行。

a) 查找包含单词的行:easy!

首先,我想对其进行过滤,以便在列中获得包含单词“jo”并且在meter col 中具有值“11”的每一行。简单的:

library(tidyverse)

PAM_text_tag %>%
    filter_all(any_vars(. == "jo")) %>%
    filter(meter=="11")

这实际上就是上面说明的 df 的原因。

b) 查找包含一个单词的行,后跟两个 col。远离特定内容

但现在我希望能够过滤它以仅获取包含“jo”后跟元音初始单词的行。鉴于 df 的结构(我不想改变),我必须看看“jo”之后的两列会发生什么:如果“jo”在 SYLL_TAG3 中,则 SYLL_TAG3-1 中没有任何内容,我需要检查 SYLL_TAG4 是否以元音开头。

目标:过滤后的输出应仅包含第 4、5、6、8、10 和 12 行(仅包含包含“jo”的单元格后跟一个空单元格,然后是一个以元音开头的单元格的行)。

我的问题

问题是:如何在不使用 col 的情况下在列的位置表达n+2的东西。名字?(我不知道“jo”会出现在哪一列)

补充材料

该文本中使用的所有元音列表:

aeiouyäëïöüÿáéíóúàèìòùâêîôû

我想我只需要使用str_detectwithpattern="^[aeiouyäëïöüÿáéíóúàèìòùâêîôû]"来匹配元音初始词。我的问题更多是关于如何表达n+2的事情,而不是关于filter.

标签: rdplyr

解决方案


这是一个基本的 R 选项:

#Get the row column index where 'jo' is present
mat <- which(PAM_JO == 'jo', arr.ind = TRUE)
#Add 1 to column index to compare with NA
mat1 <- cbind(mat[, 1], mat[, 2] + 1)
#Add 2 to column index to compare with vowels
mat2 <- cbind(mat[, 1], mat[, 2] + 2)

#convert to dataframe
PAM_JO <- data.frame(PAM_JO)
#Create a logical vector
inds <- PAM_JO[mat1] == 'NA' & grepl('^[aeiou]', PAM_JO[mat2])
#Subset the data
result <- PAM_JO[mat[, 1][inds], ]

推荐阅读