我在R中有一个动态数据帧,它是根据用户输入生成的层次结构表。我正在尝试删除基于特定条件存在重复的行。因此,表并不总是x列或y行,它总是会根据用户输入进行更改。
数据帧(例如(如下所示:
类别1--类别2--类别3--类别4-
现金-----NA------NA
货币-----NA---------NA
现金-----Cash-----NA-
政府NA--------NA-
政府安全NA--------NA
政府安全保障-NA-
政府安全安全保障代码
这个具体的例子大约持续了1100行。
我想删除有两个类似列值的行,不包括NA。对于上面的示例,"Cash NA NA NA"将保留在数据框中,但其他两个现金行将被排除在外。"政府NA NA NA"one_answers"政府安全NA NA"将保留,但"政府安全安全NA"将被删除,因为它与上面的行基本相同。
我现在使用的代码是这个
sub.df2 = sub.df2[apply(sub.df2, MARGIN = 1, FUN = function(x) !any(duplicated(x, incomparables = NA))), , drop = FALSE]
然而,这也删除了最后一行——"政府安全代码",我需要这一行以类似的方式保持在100-200左右。
由于您实际上只是在寻找唯一的行,删除行中相同的元素,请尝试以下操作:
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"
现在我们可以在list
:上使用duplicated
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))
也许你可以像建议的那样做,然后使用函数na.omit(df2)
来消除所有"不完整"行;您将再次拥有最后一行(只有当您的标准是没有NA的行时才有效(
# your function
df_red <- df2[apply(df2, MARGIN = 1, FUN = function(x) !any(duplicated(x, incomparables = NA))), , drop = FALSE]
# new dataframe with na.omit()
df_naOmit <- na.omit(df2)
# combine two dataframes
df_new <- rbind(df_red,df_naOmit)
df_new
数据帧仅包括没有重复的列,还包括最后一个完全填充的行。