我有一个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
因此,我想弄清楚如何制作一个将要运行的功能
到目前为止,我具有每一列的最大长度以及小数点。
我只需要一些帮助,即可将其连接到保留值并将这些保留值从数据框中删除。
如果需要更多信息,请发表评论,因为如有需要,我将进一步详细说明。
代码示例:对于保留值,我正在考虑创建一个单独的数据框,并使用该数据框删除值。欢迎其他建议。
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数据帧的行名称与原始数据帧名称匹配。那可能是将两者链接在一起的一种方式吗?
可能有一种更快的方法来完成所有操作,欢迎所有建议。
答案 0 :(得分:1)
edit:现在,我明白了您对“保留值”的含义-一项不应计入的调查答案(例如,“我不想回答这个问题”)
这里基本上有三种简单的方法,而不必搜索“整数长度”或其他过度设计的方法:
您的数据与您的规范不符(“总是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
加载库
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
注意:只有在每列总是有四个异常值的情况下,这种方法才有效。。
加载库
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
加载库
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
加载库
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”,这将不起作用。