У меня есть кадр данных, который выглядит следующим образом, но в общей сложности 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)))
1
Malna 30 Май 2019 в 17:43

2 ответа

Лучший ответ

Далее используется только база 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 .

С векторами в вопросе data.frame создается со следующим кодом. Он использует функцию из внешнего пакета stringr.

v <- stringr::str_sort(ls(pattern = '^T[[:digit:]]+$'), numeric = TRUE)
df1 <- data.frame(mget(v))
1
Rui Barradas 30 Май 2019 в 15:58

Я фанат 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)
0
akash87 30 Май 2019 в 15:59