Porównuję kilka kolumn zmiennych ID wciągniętych z grupy plików na listę główną, identyfikatory te powinny pasować do kolumn. Używam Case_when, aby upewnić się, że każdy spełniają listę główną, ale zastanawiałem się, czy wystąpił wygodny sposób, aby zmienić wyjście "True ~" do nazwy kolumny wartości, która nie powiodła się testu?

Oto podstawowy gist,

a <- c(1,2,3,4)
b <- c(1,2,3,4)
c <- c(1,2, "NA", "NA")
d <- c(1,2,3,4)

example <- data.table(a,b,c,d)

example %>% mutate(
   test = case_when(
      a==b & a==c & a==d ~ "PASS",
   TRUE ~ "FAIL")
)

Co zrobi podstawowe zadanie flagowania jakichkolwiek wartości, które zawiedzie test, ale czy istnieje modułowy sposób zmiany wyjścia True ~ "Fail" do nazwy kolumny, która wyprodukowała awarię "C" w tym przypadku?

1
DadVlad 14 kwiecień 2021, 19:27

2 odpowiedzi

Najlepsza odpowiedź
library(dplyr)

example %>% 
  rowwise() %>% 
  dplyr::mutate(cond = cond = names(example)[which(!replace_na(a == c_across(b:d), F)) + 1] %>% 
                  paste(collapse = ",")) %>% 
  ungroup()

Uwaga: + 1 jest dlatego, że to nazwy kolumn według indeksu oparte na których nie przejdzie. + 1 jest pomijanie kolumny a tak, że cond pokazuje poprawną kolumnę. paste jest używany w przypadku, gdy istnieją wiele kolumn, które nie spełniają stanu. Będą przecinkami rozdzieloną w cond.

Również jak wspomniano w komentarzach przez @ r2evans o skórę zmodyfikowałem c <- c(1,2, "NA", "NA"), aby być c <- c(1,2, NA, NA).

Wyjście

      a     b     c     d cond 
  <dbl> <dbl> <dbl> <dbl> <chr>
1     1     1     1     1 ""   
2     2     2     2     2 ""   
3     3     3    NA     3 "c"  
4     4     4    NA     4 "c" 

Wiele kolumn Fail Stand

a <- c(1,2,3,4)
b <- c(1,2,3,4)
c <- c(1,2, NA, NA)
d <- c(1,2,3,6)

example <- data.frame(a,b,c,d)

example %>% 
  rowwise() %>% 
  dplyr::mutate(cond = cond = names(example)[which(!replace_na(a == c_across(b:d), F)) + 1] %>% 
                  paste(collapse = ",")) %>% 
  ungroup()

      a     b     c     d cond 
  <dbl> <dbl> <dbl> <dbl> <chr>
1     1     1     1     1 ""   
2     2     2     2     2 ""   
3     3     3    NA     3 "c"  
4     4     4    NA     6 "c,d"
0
LMc 14 kwiecień 2021, 17:03

Przechowywanie wektorów w ramce danych i przy użyciu sapply może działać:

a <- c(1,2,3,4)
b <- c(1,2,3,4)
c <- c(1,2, "NA", "NA")
d <- c(1,2,3,4)
df <- data.frame(a,b,c,d)

result <- sapply(2:4, function(x) identical(df$a, df[, x]))
result
[1]  TRUE FALSE  TRUE

Dostosowałbyś parametry wewnątrz sapply zgodne z wymiarami rzeczywistej ramy danych. Możesz także rbind result do df za pomocą wartości manekiny włożonej do kolumny {x4}}:

result <- c(999, result)
df <- rbind(result, df)
df
    a b  c d
1 999 1  0 1
2   1 1  1 1
3   2 2  2 2
4   3 3 NA 3
5   4 4 NA 4

Wartości logiczny result są konwertowane na całkowitą dla integralności typu. Zer w wierszu wyników wskazują, które kolumny nie powiodły się test.

0
SteveM 14 kwiecień 2021, 17:24