簡體   English   中英

在 R 中使用條件語句過濾重復名稱 - Reprex

[英]Filtering for Duplicated Names with Conditional Statements in R - Reprex

我有一個大型數據庫,其中有部分重復的行。 我正在嘗試在 dplyr 中使用帶有條件語句的過濾器來刪除這些部分重復的行。

目標:我想刪除所有存在 a1 和 id1 的重復組合且 var1 等於 0 的行。為此,我嘗試在我的過濾器 function 中使用 duplicated() 調用以及條件語句。

問題:我在下面使用的下面的代碼似乎忽略了 var1 等於零的最后一個條件。 我嘗試了兩種不同的過濾方式來獲得想要的結果,但都無濟於事。 我的 duplicated() 調用有問題嗎? 我應該改用 distinct() 嗎?

library(dplyr)
a1 <- c('adam', 'adam', 'adam', 'megan', 'megan', 'megan', 'jen', 'jen', 'jen')
id1 <- c('a', 'a', 'b', 'a', 'b', 'b', 'a', 'b', 'c')
var1 <- as.numeric(c('0', '3.2', '3', '2.2', '1.1', '0', '1.2', '2.4','3.1'))
test_df <- data.frame(a1, id1, var1)

#code to get rid of duplicates
test_df2 <- test_df %>%
  filter(!(duplicated(id1) & duplicated(a1) & var1 == 0))

#alternative code
test_df3 <- test_df
test_df3$new_id <- with(test_df3, paste0(a1, sep = "-", id1))

test_df3 <- test_df3 %>%
  filter(!(duplicated(new_id) & var1 == 0))

這是我得到的照片: 錯誤回報的例子

這是期望的結果: 在此處輸入圖像描述

我們可以使用group_bysummarise

librar(dplyr)
test_df %>% 
  group_by(a1, id1) %>% 
  summarise(var1 = sum(var1))
 a1    id1    var1
  <chr> <chr> <dbl>
1 adam  a       3.2
2 adam  b       3  
3 jen   a       1.2
4 jen   b       2.4
5 jen   c       3.1
6 megan a       2.2
7 megan b       1.1

我能夠通過使用 Janitor 的 get_dupes 然后從該子集進行過濾來解決這個問題。 我不確定為什么我不能使用 dplyr 中的條件語句來實現此目的,但這是一種效果很好的 hack。

library(janitor)
library(dplyr)

a1 <- c('adam', 'adam', 'adam', 'megan', 'megan', 'jen', 'jen', 'jen')
id1 <- c('a', 'b', 'a','a', 'b', 'a', 'b', 'a')
var1 <- as.numeric(c('3.2', '2.7', '0','2', '1.1', '0', '2.2','3.1'))
var2 <- as.numeric(c('3.4', '3', '0','1.7', '1.2', '3', '0','3.3'))
test_df <- data.frame(a1, id1, var1, var2)
test_df$a1_id1 <- with(test_df, paste0(a1, sep = "-", id1))

#get all instances where there is a duplicated name and id
test_df2 <- test_df %>%
  get_dupes(a1_id1)

#remove rows that have var1 as 0 and remove column called dupe_count
test_df3 <- test_df2 %>%
  filter(var1 != 0) %>%
  select(-dupe_count)

#Remove all instances of duplicate names
test_df4 <- test_df %>%
  group_by(a1_id1) %>%
  filter(n() == 1)

#combine the two df's created and bind together for the desired output.
test_df_updated <- dplyr::bind_rows(test_df3, test_df4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM