如何根据特定条件删除R中的行



我在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数据帧仅包括没有重复的列,还包括最后一个完全填充的行。

最新更新