【问题标题】:R dplyr find all mutated rowsR dplyr 查找所有变异的行
【发布时间】:2020-04-26 15:54:29
【问题描述】:

我想识别在 mutate 之后已更改的 tibble 的所有行。 我的真实数据有多列,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))

reprex package (v0.3.0) 于 2020 年 4 月 26 日创建

现在我正在寻找一种方法,如何将 df 的所有行与 dfnew 进行比较,并识别出至少有一个变化的所有行。

期望的输出是:

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以这样做:

    anti_join(dfnew, df)
    
      name  value
      <chr> <dbl>
    1 A         2
    2 K         2
    

    【讨论】:

      【解决方案2】:

      @tmfmnk 的响应可以解决问题,但如果您想使用循环(例如,根据您正在检查的内容使用不同类型的消息或警告以获得一定的灵活性),您可以这样做:

      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
      

      【讨论】:

        【解决方案3】:

        我们也可以使用dplyr中的setdiff

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

        或者使用来自data.tablefsetdiff

        library(data.table)
        fsetdiff(setDT(dfnew), setDT(df))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          相关资源
          最近更新 更多