У меня есть фрейм данных, который выглядит так, но всего с 31 переменной (столбцами) и 11000 наблюдений (отсутствующие значения пусты):
T1 = c("a1", "c1", "e1", "d1", "a3", "f1", "f2")
T2 = c("b1", "d1", "a1", "b2", "a3", "f1", "f3")
T3 = c(NA, NA, "e1", "d1", NA, "a4", "f3")
T4 = c( NA, NA, NA, "b2", NA, "b3", "f5")
T5 = c( NA, NA, NA, NA, NA, "a4", "f6")
T6 = c( NA, NA, NA, NA, NA, NA, "f7")
T7 = c(NA, NA, NA, NA, NA, NA, "c1")
T8 = c(NA, NA, NA, NA, NA, NA, "c1")
T9 = c(NA, NA, NA, NA, NA, NA, "f2")
T10= c(NA, NA, NA, NA, NA, NA, "f3")
Я хотел бы определить, есть ли какой-либо дублированный элемент переменных типа «T» по строкам, поэтому мой df будет выглядеть так:
T1 = c("a1", "c1", "e1", "d1", "a3", "f1", "f2")
T2 = c("b1", "d1", "a1", "b2", "a3", "f1", "f3")
T3 = c(NA, NA, "e1", "d1", NA, "a4", "f3")
T4 = c( NA, NA, NA, b2, NA, "b3", "f5")
T5 = c( NA, NA, NA, NA, NA, "a4", "f6")
T6 = c( NA, NA, NA, NA, NA, NA, "f7")
T7 = c(NA, NA, NA, NA, NA, NA, "c1")
T8 = c(NA, NA, NA, NA, NA, NA, "c1")
T9 = c(NA, NA, NA, NA, NA, NA, "f2")
T10= c(NA, NA, NA, NA, NA, NA, "f3")
D = c(F, F, T, T, T, T, T)
Я попытался написать функцию, но явно что-то упустил, потому что она не работает: сначала я создал новую переменную с пустыми значениями
df$D <- ""
затем функция:
dupl <- function(x){
for(i in 1:nrow(x))
if (duplicated(x[i], incomparables = NA)){
df$D <- "TRUE"
}else{
df$D <- "FALSE"
}
}
df$D <- dupl(df)
Я также пробовал этот код, но он не дает мне строки (когда D принимает значение true), которые содержат дублированные элементы:
df$D <- apply(df[-1], 1, function(i) any(duplicated(i, incomparables = NA)))
Спасибо вам обоим за комментарии, теперь последний код работает, еще не знаю что не так с функцией но предполагаю что главное что есть решение. Я удалил другие столбцы из своих исходных данных и забыл включить столбец id, но в коде, который я считал с ним, поэтому я не получил правильные данные. Спасибо еще раз.
У вас есть ответы, пожалуйста, прочитайте, что делать, когда кто-то отвечает ваши вопросы.
На самом деле я использовал код, который я наложил на себя, просто нужно было его исправить, но из ответов я бы предпочел второй, поэтому я выбрал его. Не могу указать полезность, потому что я новичок в этом и у меня низкие баллы репутации (хотя я это сделал, это просто не показано здесь). И да, я все еще изучаю правила игры.
Я фанат dplyr
и tidyverse
, поэтому я бы пошел по этому пути:
df <- data.frame(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
df %>%
mutate(index = row_number()) %>%
gather(key, value, -index, na.rm = T) %>%
group_by(index) %>%
summarise(D = any(duplicated(value))) %>%
cbind(df)
Спасибо за это. Я относительно новичок в R, поэтому я не знаю, как получить объект D из этого кода. Было бы сложно проанализировать 11000 строк.
Нет, я просто не знаю, как использовать ваш код, чтобы добавить результат в свой df. Я могу получить ответ в консоли, но он мне нужен как новая переменная в файле df. Использование этого кода дает результат, который я хотел: df$D <- apply(df, 1, function(i) any(duplicated(i, incomparables = NA)))
Поэтому я добавил cbind
, что добавит это к вашему df
.
В следующем используется только база R.
df1$D <- apply(df1, 1, function(x) {
x <- na.omit(x)
any(unlist(Map('==', x[1], x[-1])))
})
df1
# T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 D
#1 a1 b1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#2 c1 d1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#3 e1 a1 e1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#4 d1 b2 d1 b2 <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#5 a3 a3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#6 f1 f1 a4 b3 a4 <NA> <NA> <NA> <NA> <NA> TRUE
#7 f2 f3 f3 f5 f6 f7 c1 c1 f2 f3 TRUE
Данные.
С векторами в вопросе data.frame создается с помощью следующего кода. Он использует функцию из внешнего пакета stringr
.
v <- stringr::str_sort(ls(pattern = '^T[[:digit:]]+$'), numeric = TRUE)
df1 <- data.frame(mget(v))
Пожалуйста, используйте
dput
, чтобы показать пример. Значенияa1
,c1
и т. д. являются строками и нуждаются в кавычках. Вы можете проверить, скопировав/вставив код в консоль R, и посмотреть, работает ли он. Вариантapply(df1, 1, FUN = function(x) anyDuplicated(x[x! = ""]))