Как определить повторяющиеся элементы в строках

У меня есть фрейм данных, который выглядит так, но всего с 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)))

Пожалуйста, используйте dput, чтобы показать пример. Значения a1, c1 и т. д. являются строками и нуждаются в кавычках. Вы можете проверить, скопировав/вставив код в консоль R, и посмотреть, работает ли он. Вариант apply(df1, 1, FUN = function(x) anyDuplicated(x[x! = ""]))

akrun 30.05.2019 16:45

Спасибо вам обоим за комментарии, теперь последний код работает, еще не знаю что не так с функцией но предполагаю что главное что есть решение. Я удалил другие столбцы из своих исходных данных и забыл включить столбец id, но в коде, который я считал с ним, поэтому я не получил правильные данные. Спасибо еще раз.

Malna 30.05.2019 17:32

У вас есть ответы, пожалуйста, прочитайте, что делать, когда кто-то отвечает ваши вопросы.

Rui Barradas 31.05.2019 11:10

На самом деле я использовал код, который я наложил на себя, просто нужно было его исправить, но из ответов я бы предпочел второй, поэтому я выбрал его. Не могу указать полезность, потому что я новичок в этом и у меня низкие баллы репутации (хотя я это сделал, это просто не показано здесь). И да, я все еще изучаю правила игры.

Malna 31.05.2019 14:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я фанат 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 строк.

Malna 30.05.2019 17:47

Нет, я просто не знаю, как использовать ваш код, чтобы добавить результат в свой df. Я могу получить ответ в консоли, но он мне нужен как новая переменная в файле df. Использование этого кода дает результат, который я хотел: df$D <- apply(df, 1, function(i) any(duplicated(i, incomparables = NA)))

Malna 30.05.2019 17:57

Поэтому я добавил cbind, что добавит это к вашему df.

akash87 30.05.2019 18:00
Ответ принят как подходящий

В следующем используется только база 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))

Другие вопросы по теме