#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)