У меня есть, например, такой набор данных:
data <- data.frame(matrix(c(1,2,2,3,4,5,5,"a","a","b","a","a","a","b"), nrow = 7, ncol = 2, byrow = F))
X1 X2
1 a
2 a
2 b
3 a
4 a
5 a
5 b
затем я добавляю еще одну переменную «тег», изначально установленную на 0.
data$tag <- 0
X1 X2 tag
1 a 0
2 a 0
2 b 0
3 a 0
4 a 0
5 a 0
5 b 0
Я хотел бы иметь «тег», равный 1, для каждой повторяющейся строки, например:
X1 X2 tag
1 a 0
2 a 1
2 b 1
3 a 0
4 a 0
5 a 1
5 b 1
Я использовал следующий код:
for (i in data$X1) {
for (j in 1:length(data$X1)) {
if (j==2) {data$tag[j] <- 1}
}
}
но это не работает, как я хотел бы. Я бы хотел, чтобы второй цикл (j) работал внутри предыдущего, чтобы получить то, что я хочу, где j начинается с 1 каждый раз, когда изменяется X1. Как мне с этим справиться?
Большое спасибо
Обратите внимание: если вы рассматриваете повторяющиеся строки, а не значения в столбце X1
, адаптируйте ответ @Ronak Shah к: data$tag <- as.integer(duplicated(data) | duplicated(data, fromLast=TRUE))
. Для текущих данных нет дубликатов по строкам, но есть дубликаты значений в столбцах X1
и X2
по отдельности.
Вы можете использовать duplicated
с обоих концов в базе R:
data$tag <- as.integer(duplicated(data$X1) |
duplicated(data$X1, fromLast = TRUE))
data
# X1 X2 tag
#1 1 a 0
#2 2 a 1
#3 2 b 1
#4 3 a 0
#5 4 a 0
#6 5 a 1
#7 5 b 1
Может быть, вы можете попробовать ave
within(
data,
tag <- +(ave(X1, X1, FUN = length) > 1)
)
который дает
X1 X2 tag
1 1 a 0
2 2 a 1
3 2 b 1
4 3 a 0
5 4 a 0
6 5 a 1
7 5 b 1
Вариант с add_count
library(dplyr)
data %>%
add_count(X1) %>%
mutate(n = +(n > 1))
Да, это правильно.