R dplyr найти все мутированные строки - PullRequest
2 голосов
/ 26 апреля 2020

Я хотел бы идентифицировать все строки тиббла, которые были изменены после mutate. Мои реальные данные имеют несколько столбцов, и функция mutate изменяет более одного столбца одновременно.

# library 
library(tidyverse)

# get df
df <- tibble(name=c("A","B","C","D"),value=c(1,2,3,4))

# mutate df
dfnew <- df %>% 
  mutate(value=case_when(name=="A" ~ value+1, TRUE ~value)) %>% 
  mutate(name=case_when(name=="B" ~ "K", TRUE ~name))

Создано в 2020-04-26 пакетом prex ( v0.3.0)

Теперь я ищу способ сравнить все строки df с dfnew и идентифицировать все строки хотя бы с одним изменением.

Желаемый результат будет:

# desired output:
# 
# # A tibble: 4 x 2
# name  value
# <chr> <dbl>
# 1 A         2
# 2 K         2

Ответы [ 3 ]

3 голосов
/ 26 апреля 2020

Вы можете сделать:

anti_join(dfnew, df)

  name  value
  <chr> <dbl>
1 A         2
2 K         2
1 голос
/ 26 апреля 2020

Мы также можем использовать setdiff из dplyr

library(dplyr)
setdiff(dfnew, df)
# A tibble: 2 x 2
#  name  value   
#  <chr> <dbl>
#1 A         2
#2 K         2

Или использовать fsetdiff из data.table

library(data.table)
fsetdiff(setDT(dfnew), setDT(df))
1 голос
/ 26 апреля 2020
Ответ

@ tmfmnk делает свое дело, но если вы хотите использовать al oop (например, для некоторой гибкости, используя различные виды сообщений или предупреждений в зависимости от того, что вы проверяете), вы можете сделать:

output <- list()
for (i in 1:nrow(dfnew)) {
  if (all(df[i, ] == dfnew[i, ])) {
    next
  }
  output[[i]] <-  dfnew[i, ]
}
bind_rows(output)

# A tibble: 2 x 2
  name  value
  <chr> <dbl>
1 A         2
2 K         2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...