我有興趣對一組列進行字串檢測。如果找到該字串(在本例中為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
資訊:
我的資料框有一百多列。我只對某些名稱以 string 結尾的列感興趣.zsd。這些列可以具有NA以下字串值ZAD、ZSD、或其中之一Not Achieved ZSD。
我只是對檢測 string 的存在感興趣ZSD。如果未在任何列中找到,則應在輸出列 ( zsd.level) 中回傳 NA 。如果在多列中找到該字串,我想回傳包含該字串的最后一個列名/編號。
我的問題類似于這篇文章,但不完全相同的dplyr 過濾器在多列上有條件
輸出
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"))
但是我怎樣才能把多個條件放在一起呢?任何幫助將不勝感激。
uj5u.com熱心網友回復:
我們可以這樣做:
library(dplyr)
library(tidyr)
library(stringr)
df %>%
mutate(across(contains("zsd"), ~case_when(str_detect(., "ZSD") ~ cur_column()), .names = 'new_{col}')) %>%
unite(zsd_level, starts_with('new'), na.rm = TRUE, sep = ' ') %>%
mutate(zsd_level = str_remove_all(zsd_level, ".zsd"),
zsd_level = str_sub(zsd_level, -1))
輸出:
a.zsd b.zsd c.zsd d.zsd zsd_level
1 ZSD ZAD <NA> ZAD a
2 ZAD <NA> <NA> ZSD d
3 <NA> <NA> ZAD <NA>
4 Not Achieved ZSD <NA> ZAD <NA> a
5 ZSD ZSD <NA> ZSD d
6 <NA> <NA> <NA> <NA>
uj5u.com熱心網友回復:
另一種選擇,但比親愛的 TarJae 的要復雜一點:
library(dplyr)
library(tidyr)
library(stringr)
df %>%
mutate(rn = row_number()) %>%
pivot_longer(-rn) %>%
group_by(rn) %>%
filter(str_detect(value, "ZSD")) %>%
slice_tail() %>%
summarise(name = str_remove(name, ".zsd")) %>%
right_join(df %>% mutate(rn = row_number()), by = "rn") %>%
arrange(rn) %>%
ungroup() %>%
select(ends_with("zsd"), zsd.level = name)
這回傳
# A tibble: 6 x 5
a.zsd b.zsd c.zsd d.zsd zsd.level
<chr> <chr> <chr> <chr> <chr>
1 ZSD ZAD NA ZAD a
2 ZAD NA NA ZSD d
3 NA NA ZAD NA NA
4 Not Achieved ZSD NA ZAD NA a
5 ZSD ZSD NA ZSD d
6 NA NA NA NA NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/321772.html
