Поскольку вы действительно просто ищете уникальные строки , удаляя идентичные элементы в строке, попробуйте следующее:
df2a <- apply(df2, 1, unique)
df2a
# [[1]]
# [1] "Cash" NA
# [[2]]
# [1] "Cash" NA
# [[3]]
# [1] "Cash" NA
# [[4]]
# [1] "Government" NA
# [[5]]
# [1] "Government" "Security" NA
# [[6]]
# [1] "Government" "Security" NA
# [[7]]
# [1] "Government" "Security" "Code"
Теперь мы можем использовать duplicated
на list
:
df2b <- df2a[!duplicated(df2a)]
df2b
# [[1]]
# [1] "Cash" NA
# [[2]]
# [1] "Government" NA
# [[3]]
# [1] "Government" "Security" NA
# [[4]]
# [1] "Government" "Security" "Code"
Мы могли бы попытаться объединить их обратно в рамку, но все они должны быть одинаковой длины (с добавлением NA
), поэтому:
df2c <- lapply(df2b, `length<-`, max(lengths(df2b)))
df2c
# [[1]]
# [1] "Cash" NA NA
# [[2]]
# [1] "Government" NA NA
# [[3]]
# [1] "Government" "Security" NA
# [[4]]
# [1] "Government" "Security" "Code"
Наконец, рекомбинируйте в кадр:
as.data.frame(do.call(rbind, df2c))
# V1 V2 V3
# 1 Cash <NA> <NA>
# 2 Government <NA> <NA>
# 3 Government Security <NA>
# 4 Government Security Code
Данные:
df2 <- structure(list(Class.1 = c("Cash", "Cash", "Cash", "Government",
"Government", "Government", "Government"), Class.2 = c(NA, "Cash",
"Cash", NA, "Security", "Security", "Security"), Class.3 = c(NA,
NA, "Cash", NA, NA, "Security", "Security"), Class.4 = c(NA,
NA, NA, NA, NA, NA, "Code")), class = "data.frame", row.names = c(NA,
-7L))