【问题标题】:Identify duplicate rows and only set specific columns to zero识别重复行并仅将特定列设置为零
【发布时间】:2021-09-18 15:22:06
【问题描述】:

我尝试识别数据框中的重复行,并据此仅将重复行的特定列 x 设置为 0。如果列 id 和 key 相同,我尝试将列 x 和 y 设置为零,如果重复的行也有相同的数字(大于 0)。

df <- data.frame(x=c(1,3,3,2,0,0,0,0), y=c(1,0,1,1,4,4,3,0), id=c('id1','id1','id1','id1','id2','id2','id2','id2'), key=c('key1','key1','key1','key1','key2','key2','key2','key3'))
df[order(df$id),]
duplicates <- df[duplicated(df[c('id','key')]) & (df$x != 0 | df$y != 0),]

这样,我能够识别重复的行,但现在我只想将特定列(x 或 y)设置为零(如果也有相同的值)。我尝试使用 ifelse 语句,但无法正确。

所需的输出将如下所示(x 列中只有一个值,y 列中的树值设置为 0):

output <- data.frame(x=c(1,3,0,2,0,0,0,0), y=c(1,0,0,0,4,0,3,0), id=c('id1','id1','id1','id1','id2','id2','id2','id2'), key=c('key1','key1','key1','key1','key2','key2','key2','key3'))
output[order(output$id),]

非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe duplicates


    【解决方案1】:
    library(dplyr)
    
    
    df %>%
      group_by(id, key, y) %>%
      mutate(y = ifelse(sequence(n()) > 1, 0, y)) %>%
      ungroup() %>%
      group_by(id, key, x) %>%
      mutate(x = ifelse(sequence(n()) > 1, 0, x))
    

    编辑:这是你要找的吗?让我知道你的想法,因为我不确定你到底在问什么

    【讨论】:

    • 如果我想将所有不同的值保留在 y 中(通常适用于超过 1 个值),我编辑了数据框以获得更通用的方法。有哪些必要的改变;序列(n())> 1?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2016-12-12
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多