заменить значения в строке, если она совпадает с последней строкой в R

#r #dataframe #data-manipulation

#r #dataframe #манипулирование данными

Вопрос:

У меня ниже кадра данных в R

 df <- read.table(text = "
        A   B   C   D    E
                 14  6   8   16  14
                 5   6   10  6   4
                 2   4   6   3   4
                 26  6   18  39  36
                 1   2   3   1   2
                 3   1   1   1   1
                 3   5   1   4   11
                 ", header = TRUE)
 

Теперь, если значения в последних двух строках одинаковы, мне нужно заменить эти значения на 0, может ли кто-нибудь помочь мне в этом, если это выполнимо в R

Например: значения последних двух строк в столбце 1 равны 3, поэтому мне нужно заменить 3 на 0. Также то же самое для столбца 3, последние две строки в столбце 3 равны 1, поэтому мне нужно заменить 3 на 0.

Ответ №1:

вы можете сравнить последние 2 строки и заменить в столбцах, где значения одинаковы :

 nr <- nrow(df)
df[(nr-1):nr, df[nr-1, ]==df[nr, ]] <- 0

df
#   A B  C  D  E
#1 14 6  8 16 14
#2  5 6 10  6  4
#3  2 4  6  3  4
#4 26 6 18 39 36
#5  1 2  3  1  2
#6  0 1  0  1  1
#7  0 5  0  4 11
 

Ответ №2:

Один из вариантов — перебирать столбцы, проверять if последние два элемента ( tail(x,2) ) или дублировать, затем replace с 0 или else возвращать столбец и назначать выходные данные обратно в набор данных. [] Убедитесь, что структура не повреждена.

 df[] <- lapply(df, function(x) if(anyDuplicated(tail(x, 2))>0) 
                 replace(x, c(length(x)-1, length(x)), 0) else x)
df
#   A B  C  D  E
#1 14 6  8 16 14
#2  5 6 10  6  4
#3  2 4  6  3  4
#4 26 6 18 39 36
#5  1 2  3  1  2
#6  0 1  0  1  1
#7  0 5  0  4 11
 

Ответ №3:

Вы также можете сделать это:

 r <- tail(df, 2)
r[,r[1,]==r[2,]] <- 0
df <- rbind(head(df, -2), r)