基于条件R删除数据帧中的值

基于条件R删除数据帧中的值,r,dataframe,conditional,conditional-statements,maxlength,R,Dataframe,Conditional,Conditional Statements,Maxlength,我有一个4列的数据框(本例放大)。大多数列的离群值明显大于数据框中的其他值。例如:列(最大值为99)的异常值为96、97、98、99。这些异常值本质上表示“无响应”。这显然严重扭曲了数据,因此必须删除它们。我想删除异常值,但每个变量都有不同的最大值(和不同的异常值集),有些变量有小数 96、97、98、99只能从保留值为这些值的列中删除。因此,函数必须知道哪些列具有每个特定的保留值分类。下面是更多 问题是,我不想“从所有列中删除”保留值,因为某些值在另一列中可能意味着其他值。例如,在一列中删除9

我有一个4列的数据框(本例放大)。大多数列的离群值明显大于数据框中的其他值。例如:列(最大值为99)的异常值为96、97、98、99。这些异常值本质上表示“无响应”。这显然严重扭曲了数据,因此必须删除它们。我想删除异常值,但每个变量都有不同的最大值(和不同的异常值集),有些变量有小数

96、97、98、99只能从保留值为这些值的列中删除。因此,函数必须知道哪些列具有每个特定的保留值分类。下面是更多

问题是,我不想“从所有列中删除”保留值,因为某些值在另一列中可能意味着其他值。例如,在一列中删除996可能意味着在另一列中具有重要意义,例如小时工资/周

这变得很棘手,因为有些人有小数点,比如每周工作小时数。例如每周工作37.5小时的保留值为999.6999.7999.8999.9。 该长度将被归类为5.1

我需要从数据帧中删除这些保留值,但它们必须首先匹配相应的保留值长度。由于每列具有不同的保留值,因此数据帧的列名应对应于特定的保留值

df <- data.frame("children#" = c(1,5,0,2,10), 
    "annual income" = c(700000.00,50000.65,30000.45,1000000.59,9999999.96), 
    "hour wage"= c(25.65,9999999.99,50.23,1000.72,65.16), 
    "hours worked/week" = c(148.5,77.0,64.2,25.9,999.7))
dfedit:现在我明白你所说的“保留值”是什么意思了——不应该计算的调查结果(例如,“我不想回答这个问题”)

这里有三种简单的方法,无需搜索“整数长度”或其他过度工程:

  • 最大值(即删除四个最高值)
  • 手动阈值(即删除X以上的所有值)
  • If-else逻辑(即,如果答案==X,则将其删除)
  • 构建数据集 您的数据不符合您的规范(“始终为4个异常值”),因此我冒昧地对其进行了扩展


    df不是
    hours.worked.week的“最大长度”
    5?它实际上是5.1,我已经做了编辑。因为变量中有一个小数位,所以最大长度中必须有一个小数位。这意味着从最大长度为5且不包含小数点的变量中解密。谢谢你的评论。这似乎不是一个稳健的方法。1.在不查看数据的情况下,您是否有办法知道哪列的最大值/位数(“最大长度”)?2.每列中是否总是有四个异常值?如果是,您可以删除最高的四个值。谢谢您的回复。1.不幸的是,除了找到最大长度之外,没有其他方法。由于有小数点,这就相当困难了。2.是的,每个最大长度始终有4个异常值。这样做的问题是,4个异常值是调查的保留值(96,97,98,99)。如果删除前4个异常值,并且数据只有3个保留值,则删除1个重要异常值。因此,函数必须知道只删除这4个值,而不删除任何其他重要的异常值。谢谢。谢谢你的快速回复。我编辑了我的答案。我仍然不相信“最大长度”方法有意义。如果一个最大长度为3的问题的所有答案都只是在1-99范围内,并且没有“保留答案”,那该怎么办?那么你就没有明确的指标来说明如何处理这些数据了。谢谢你的回答。不幸的是,这将不起作用,因为某些列多次重复相同的异常值。有些列有100多个(96、97、98和99)的异常值。例如,对于如何创建一个只知道删除这4个值的函数,您有什么建议吗。还要记住,每列都有不同的保留值。编辑:我使用unique来查找前4个值,现在只需要找出如何允许函数仅删除保留值。将其合并到方法#4中
    Find.Max.Length <- function(data){
    # Check Max Length of each column
    tmp <- data.frame(lapply(data, function(x) max(nchar(x, keepNA = F))))
    tmp <- data.frame(t(tmp))
    return(tmp)}
    max.length <- Find.Max.Length(df)
    
    Check.Decimal.Places <- function(x){
    if((x %% 1) != 0){
    nchar(strsplit(sub('0+$', '',as.character(x)), ".", fixed = TRUE)[[1]][[2]])
    }else{
    return(0)}
    }
    
    decimal <- data.frame(Check.Decimal.Places(df$random)) #<--- used to 
    initialize the variable before the loop
    
    for(i in seq_along(df)){
    decimal[i] <- data.frame(Check.Decimal.Places(df[[i]]))}
    
    decimal<- data.frame(t(decimal))
    rownames(decimal) <- names(df)
    length.df <- cbind(max.length, decimal)
    names(length.df) <- c("Max Length", "Decimal Place")
    
    length.df$NewVariableLength <- paste0(length.df$`Max Length`, sep= 
    ".",length.df$`Decimal Place`)