识别重复行并仅将特定列设置为零
Identify duplicate rows and only set specific columns to zero
我尝试识别数据框中的重复行,并据此仅将重复行的特定列 x 设置为 0。如果列 id 和键相同,我尝试将列 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),]
非常感谢您的帮助!
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))
编辑:这是您要找的吗?让我知道你的想法,因为我不确定你到底在问什么
我尝试识别数据框中的重复行,并据此仅将重复行的特定列 x 设置为 0。如果列 id 和键相同,我尝试将列 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),]
非常感谢您的帮助!
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))
编辑:这是您要找的吗?让我知道你的想法,因为我不确定你到底在问什么