使用分组依据列确定行中的差异

时间:2019-02-14 07:51:14

标签: r dplyr

我有这个可复制的数据框:

df <- data.frame(ID = c("A", "A", "B", "B", "B","C", "C", "D"), cost = c("0.5", "0.4", "0.7", "0.8", "0.5", "1.3", "1.3", "2.6"))

我正在尝试对ID进行分组,以测试cost列中是否存在差异,并更新一个名为Test diff的新列

中间输出

  ID cost Testdiff
1  A  0.5        Y
2  A  0.4        Y
3  B  0.7        Y
4  B  0.8        Y
5  B  0.5        Y
6  C  1.3        N
7  C  1.3        N
8  D  2.6        N

我正在考虑使用dplyr示例来执行此操作,但是我不确定match是否正确。

df %>% group_by(ID) %>% mutate(Testdiff = ifelse(match(cost) == T, "Y", "N"))

完成后,我想保留唯一ID的第一行,给我这个输出

  ID cost Testdiff
1  A  0.5        Y
2  B  0.7        Y
3  C  1.3        N
4  D  2.6        N

3 个答案:

答案 0 :(得分:2)

我们可以先使用@Override public void onResume() { super.onResume(); getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } ,然后再使用n_distinct

slice

如果您希望输出为“ Y” /“ N”而不是TRUE / FALSE

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(Testdiff = n_distinct(cost) > 1) %>%
  slice(1)

#    ID    cost  Testdiff
#   <fct> <fct> <lgl>   
#1   A     0.5   TRUE    
#2   B     0.7   TRUE    
#3   C     1.3   FALSE   
#4   D     2.6   FALSE   

我们可以使用df %>% group_by(ID) %>% mutate(Testdiff = ifelse(n_distinct(cost) > 1, "Y", "N")) %>% slice(1) ave通过基数R来解决它

aggregate

答案 1 :(得分:2)

既然我们已经有了dplyrbase R,为什么不添加data.table

library(data.table)
setDT(df)[, .(cost = cost[1], testdiff = uniqueN(cost) > 1), by = ID]

   ID cost testdiff
1:  A  0.5     TRUE
2:  B  0.7     TRUE
3:  C  1.3    FALSE
4:  D  2.6    FALSE

答案 2 :(得分:1)

另一种tidyverse可能性是:

df %>%
 group_by(ID) %>%
 mutate(Testdiff = ifelse(all(cost == first(cost)), "N", "Y")) %>%
 filter(row_number() == 1)

  ID    cost  Testdiff
  <fct> <fct> <chr>   
1 A     0.5   Y       
2 B     0.7   Y       
3 C     1.3   N       
4 D     2.6   N   

或者:

df %>%
 group_by(ID) %>%
 mutate(Testdiff = ifelse(all(cost == first(cost)), "N", "Y")) %>%
 top_n(1, wt = desc(row_number()))