根据条件R

时间:2018-10-01 12:00:52

标签: r dataframe conditional conditional-statements maxlength

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

必须仅从具有保留值的列中除去

96、97、98、99。因此,函数必须知道哪些列具有保留值的每个特定分类。下面有更多内容。

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

由于有些小数,例如每周工作小时数,因此变得棘手。例如。每周工作37.5小时,则储备值将为999.6、999.7、999.8、999.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))

最大儿童人数为2 年收入的最大长度为10.2(总数为10,两位小数) 最高时薪为10.2 每周最长工作小时数为5.1(总共5个小数点后一位)

始终为4个保留值
如果最大长度= 2,则删除保留值:96,97,98,99
如果最大长度= 3,则删除保留值:996、997、998、999 ...等等,以实数表示

带小数点:
如果最大长度= 5.1,则删除保留值:999.6、999.7、999.8、999.9。
如果最大长度= 10.2,请删除保留值:9999999.96、9999999.97、9999999.98、9999999.99

因此,我想弄清楚如何制作一个将要运行的功能

  1. 查找最大长度
  2. 用正确的保留值连接相应的最大长度
  3. 根据每列的最大长度从数据框中删除保留值

到目前为止,我具有每一列的最大长度以及小数点。

我只需要一些帮助,即可将其连接到保留值并将这些保留值从数据框中删除。

如果需要更多信息,请发表评论,因为如有需要,我将进一步详细说明。

代码示例:对于保留值,我正在考虑创建一个单独的数据框,并使用该数据框删除值。欢迎其他建议。

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`)

注意:length.df数据帧的行名称与原始数据帧名称匹配。那可能是将两者链接在一起的一种方式吗?

可能有一种更快的方法来完成所有操作,欢迎所有建议。

1 个答案:

答案 0 :(得分:1)

edit:现在,我明白了您对“保留值”的含义-一项不应计入的调查答案(例如,“我不想回答这个问题”)

这里基本上有三种简单的方法,而不必搜索“整数长度”或其他过度设计的方法:

  1. 最大值(即删除四个最大值),
  2. 手动阈值(即删除X上方的所有值),
  3. If-else逻辑(即,如果答案== X,则将其删除)。

构建数据集

您的数据与您的规范不符(“总是4个离群值”),因此我可以自由扩展它。

df <- data.frame(
               "children" = c(1, 0, 96, 2, 10, 99, 98, 99),
               "annual_income" = c(700000.00, 50000.65, 30000.45, 1000000.59, 9999999.96, 9999999.97, 9999999.98, 9999999.99),
               "hour_wage"= c(25.65, 9999999.99, 50.23, 9999999.98, 9999999.99, 9999999.98, 1000.72, 65.16),
               "hours_worked_week" = c(148.5, 999.6, 77.0, 64.2, 999.9, 999.8, 25.9, 999.7)
               )

df
  children annual_income   hour_wage hours_worked_week
1        1     700000.00       25.65             148.5
2        0      50000.65  9999999.99             999.6
3       96      30000.45       50.23              77.0
4        2    1000000.59  9999999.98              64.2
5       10    9999999.96  9999999.99             999.9
6       99    9999999.97  9999999.98             999.8
7       98    9999999.98     1000.72              25.9
8       99    9999999.99       65.16             999.7

1。最高价值方法(澄清后已过时)

加载库

library(dplyr)
library(magrittr)

获取四个异常值

children_out <- tail(sort(df$children), 4)

用NA替换异常值

df[df$children %in% children_out,]
    %<>% mutate(children = NA)

检查数据集

df
  children annual_income   hour_wage hours_worked_week
1        1     700000.00       25.65             148.5
2        0      50000.65  9999999.99             999.6
3       NA      30000.45       50.23              77.0
4        2    1000000.59  9999999.98              64.2
5       10    9999999.96  9999999.99             999.9
6       NA    9999999.97  9999999.98             999.8
7       NA    9999999.98     1000.72              25.9
8       NA    9999999.99       65.16             999.7

注意:只有在每列总是有四个异常值的情况下,这种方法才有效。。

2。手动阈值

加载库

library(dplyr)
library(magrittr)

排除现有NA,并用NA替换96或更高的值

df[!is.na(df$children) & df$children >=96, ] %<>%
    mutate(children = NA)

检查数据集

df
  children annual_income   hour_wage hours_worked_week
1        1     700000.00       25.65             148.5
2        0      50000.65  9999999.99             999.6
3       NA      30000.45       50.23              77.0
4        2    1000000.59  9999999.98              64.2
5       10    9999999.96  9999999.99             999.9
6       NA    9999999.97  9999999.98             999.8
7       NA    9999999.98     1000.72              25.9
8       NA    9999999.99       65.16             999.7

3。 If-else逻辑

加载库

library(dplyr)
library(magrittr)

保存“保留的答案”

children_res <- c(96, 97, 98, 99)

用NA替换任何保留答案(此处不需要现有的NA)

df[df$children %in% children_res, ] %<>%
    mutate(children = NA)

检查数据集

df
  children annual_income   hour_wage hours_worked_week
1        1     700000.00       25.65             148.5
2        0      50000.65  9999999.99             999.6
3       NA      30000.45       50.23              77.0
4        2    1000000.59  9999999.98              64.2
5       10    9999999.96  9999999.99             999.9
6       NA    9999999.97  9999999.98             999.8
7       NA    9999999.98     1000.72              25.9
8       NA    9999999.99       65.16             999.7

4。编辑:组合方法1&3

加载库

library(dplyr)
library(magrittr)

获取“保留的答案”

children_res <- tail(sort(unique(df$children)), 4)

用NA替换任何保留答案(此处不需要现有的NA)

df[df$children %in% children_res, ] %<>%
    mutate(children = NA)

注意:仅当您在每列中始终存在所有保留的答案(例如96、97、98和99)时,此方法才有效。如果偶然地没有人回答“ 97”,这将不起作用