[英]Filtering within summarise function in r or summing previous rows based on filter - 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_by
並summarise
:
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.