【发布时间】:2021-12-05 02:16:39
【问题描述】:
我有兴趣对一组列进行字符串检测。如果找到该字符串(在本例中为ZSD),我想返回列号/名称。如果找到多个匹配项,我想用该字符串返回最后一个列名/编号。
输入
我的输入是这样的:
a.zsd b.zsd c.zsd d.zsd
'ZSD' 'ZAD' NA 'ZAD'
'ZAD' NA NA 'ZSD'
NA NA 'ZAD' NA
'Not Achieved ZSD' NA 'ZAD' NA
'ZSD' 'ZSD' NA 'ZSD'
NA NA NA NA
输出
我需要的输出是一个新列zsd.level:
a.zsd b.zsd c.zsd d.zsd zsd.level
'ZSD' 'ZAD' NA 'ZAD' a
'ZAD' NA NA 'ZSD' d
NA NA 'ZAD' NA NA
'Not Achieved ZSD' NA 'ZAD' NA a
'ZSD' 'ZSD' NA 'ZSD' d
NA NA NA NA NA
信息:
我的数据框有一百多列。我只对名称以字符串.zsd 结尾的某些列感兴趣。这些列可以具有NA 或以下字符串值之一ZAD、ZSD、Not Achieved ZSD。
我只是对检测字符串ZSD 的存在感兴趣。如果在任何列中都找不到,它应该在输出列中返回 NA (zsd.level)。如果在多列中找到该字符串,我想返回包含该字符串的最后一列名称/编号。
我的问题与这篇文章类似但不完全相同dplyr filter with condition on multiple columns
输入
dput(df)
structure(list(a.zsd = c("ZSD", "ZAD", NA, "Not Achieved ZSD", "ZSD", NA),
b.zsd = c("ZAD", NA, NA, NA, "ZSD", NA),
c.zsd = c(NA, NA, "ZAD", "ZAD", NA, NA),
d.zsd = c("ZAD", "ZSD", NA, NA, "ZSD", NA)),
class = "data.frame", row.names = c(NA, -6L))
部分解决方案
要选择名称以.zsd 结尾的那些列,我可以这样做
library(stringr)
library(tidyverse)
df %>%
select(ends_with(".zsd"))
要选择或过滤带有字符串ZSD 的行,我可以这样做
str_detect(., "ZSD"))
但是我怎样才能把多个条件放在一起呢?任何帮助将不胜感激。
【问题讨论】:
-
如果
ZSD是像第 5 行那样的多列怎么办 -
"如果找到多个匹配项,我想返回包含该字符串的最后一列。"
-
对不起,这是一个字符串。我应该更新并澄清它只是在一列中。