如何从数据框中动态检查未更改的行。(通过分组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")
答案 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