如何检查数据帧中的unchange行值(通过分组ID)

时间:2017-09-07 06:40:15

标签: r

如何从数据框中动态检查未更改的行。(通过分组ID)

我的数据框。

    ID       NAME           GENDER             AGE
     1       muthu          male               20
     1       MUTHU          MALE               20
     2       NA             male               28
     3       jake           male               30
     3       jake           male               31
     4       jhon           male               21
     4      \n\rjhon\n\r    \n\male\n\r        21 
     5        NA             NA                NA 
     5        NA             NA                NA

预期结果将是。

Unchanged ID
         1
         2
         4
         5

输入数据,

structure(list(ID = c(1, 1, 2, 3, 3, 4, 4, 5, 5), NAME = structure(c(4L, 
5L, NA, 2L, 2L, 3L, 1L, NA, NA), .Label = c("\\n\\rjhon\\n\\r", 
"jake", "jhon", "muthu", "MUTHU"), class = "factor"), GENDER = structure(c(2L, 
3L, 2L, 2L, 2L, 2L, 1L, NA, NA), .Label = c("\\n\\male\\n\\r", 
"male", "MALE"), class = "factor"), AGE = c(20, 20, 28, 30, 31, 
21, 21, NA, NA)), .Names = c("ID", "NAME", "GENDER", "AGE"), row.names = c(NA, 
-9L), class = "data.frame")

2 个答案:

答案 0 :(得分:2)

以下是使用data.table的选项。将'data.frame'转换为'data.table'(setDT(df1)),按'ID'分组,将其转换为'lower'后删除任何\n\r,找到唯一元素的数量(uniqueN),检查它是否等于1,然后Reduce使用&将其返回到单个逻辑列,并根据逻辑对“ID”进行子集化列('V1')

library(data.table)
setDT(df1)[, Reduce(`&`, lapply(.SD, function(x) 
    uniqueN(gsub("([\\]+)(n|r)|[\\]+", "", tolower(x)))==1)) , ID][(V1), .(ID)]
#   ID
#1:  1
#2:  2
#3:  4
#4:  5

答案 1 :(得分:2)

这是一个基础R的想法。我们会清除\\n\\r中的名称并将其转换为tolower。之后,未更改的行是具有重复项的行。第二个条件是,该组只有一个我们使用ave处理的条目。

c(df$ID[duplicated(sapply(df, function(i) tolower(gsub('[\\]n|[\\r]', '', i))))], 
  df$ID[with(df, ave(ID, ID, FUN = length)) == 1])

#[1] 1 4 5 2