此部分内容会每日更新,包括但不限于基础知识,进阶知识,数据处理,图表展示,数据分析实战,机器学习算法等~ !!!
本人统计学硕士在读,想在2024年完成sql、python、R语言、stata、matlab等软件的复盘和巩固,目前在做统计学知识和R语言的复习~
后续考虑出相关视频进行讲解说明,请大家持续点赞+收藏+关注哈,大家一起沟通交流~

2.2 数据清洗与整理

(1)缺失值的识别与处理

习题20:
题目:编写代码,将一个数据框中的缺失值用该列的均值替换。

将数据框中的缺失值用该列的均值替换:

# 假设df是你要处理的数据框
df[is.na(df)] <- lapply(df, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

习题21:
题目:识别一个数据框中的缺失值,并将它们标记为一个新的类别。

识别数据框中的缺失值,并将它们标记为一个新的类别:

# 假设df是你要处理的数据框,并且新类别为'Missing'
df[is.na(df)] <- 'Missing'

习题22:
题目:使用na.omit()函数去除一个数据框中含有缺失值的行。

使用na.omit()函数去除含有缺失值的行:

# 假设df是你要处理的数据框
df_clean <- na.omit(df)

习题23:
题目:创建一个函数,该函数接受一个数据框和一个替换值作为参数,将数据框中的所有缺失值替换为指定的替换值。

创建一个函数,将数据框中的所有缺失值替换为指定的替换值:

replace_na <- function(df, replacement) {
  df[is.na(df)] <- replacement
  return(df)
}

# 使用函数替换缺失值
df_replaced <- replace_na(df, 'ReplacementValue')

习题24:
题目:分析一个数据框,统计每列缺失值的数量,并将结果以数据框的形式返回。

统计每列缺失值的数量,并以数据框的形式返回:

# 计算每列缺失值的数量
na_counts <- colSums(is.na(df))

# 将结果转换为数据框
na_counts_df <- data.frame(Column = names(df), NA_Count = na_counts)
print(na_counts_df)
(2)异常值的检测与修正

习题25:
题目:使用箱线图识别一个数值列中的异常值。

使用箱线图识别数值列中的异常值:

# 假设num_col是包含数值的数据框列
boxplot(df$num_col, main="Boxplot to Identify Outliers", ylab="Value", xlab="Variable")

习题26:
题目:编写一个函数,该函数使用IQR方法检测一个数值向量中的异常值,并返回这些异常值。

使用IQR方法检测数值向量中的异常值:

iqr_outlier_func <- function(vec) {
  Q1 <- quantile(vec, probs = 0.25)
  Q3 <- quantile(vec, probs = 0.75)
  IQR <- IQR(vec)
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  outliers <- vec[vec < lower_bound | vec > upper_bound]
  return(outliers)
}

# 使用函数检测异常值
outliers <- iqr_outlier_func(df$num_col)

习题27:
题目:将一个数据框中的异常值替换为该列的中位数。

将数据框中的异常值替换为该列的中位数:

# 假设已经通过某种方式识别了异常值并存储在outliers中
replace_outliers <- function(df, col_name, outliers) {
  median_val <- median(df[!df[[col_name]] %in% outliers, na.rm = TRUE)
  df[df[[col_name]] %in% outliers] <- median_val
  return(df)
}

# 使用函数替换异常值
df_clean <- replace_outliers(df, 'num_col', outliers)

习题28:
题目:创建一个函数,该函数接受一个数据框和一个阈值作为参数,标记超过该阈值的值为异常值。

创建一个函数,标记超过阈值的值为异常值:

mark_outliers <- function(df, col_name, threshold) {
  df$is_outlier <- ifelse(df[[col_name]] > threshold, TRUE, FALSE)
  return(df)
}

# 使用函数标记异常值
df_with_outliers <- mark_outliers(df, 'num_col', 100) # 假设阈值为100

习题29:
题目:使用zscore方法检测异常值,并返回异常值的索引。

使用zscore方法检测异常值,并返回异常值的索引:

zscore_outliers <- function(vec, threshold = 3) {
  z_scores <- (vec - mean(vec, na.rm = TRUE)) / sd(vec, na.rm = TRUE)
  outlier_indices <- which(abs(z_scores) > threshold)
  return(outlier_indices)
}

# 使用函数检测异常值索引
outlier_indices <- zscore_outliers(df$num_col)
(3)重复值的查找与删除

习题31:
题目:查找一个数据框中所有重复的行,并返回这些行的索引。

答案:

# 假设数据框为df
duplicate_indices <- which(duplicated(df) | duplicated(df, fromLast = TRUE))
print(duplicate_indices)

习题32:
题目:编写代码,删除一个数据框中的重复行,但保留第一次出现的行。

答案:

# 假设数据框为df
df_unique <- df[!duplicated(df), ]
print(df_unique)

习题33:
题目:创建一个函数,该函数接受一个数据框和一个列名作为参数,删除该列中重复的值。

答案:

remove_duplicates_in_column <- function(df, column_name) {
  df[!duplicated(df[[column_name]]), , drop = FALSE]
}

# 使用示例
df <- data.frame(A = c(1, 2, 2, 3, 4, 4, 4), B = c('a', 'b', 'c', 'a', 'b', 'c', 'd'))
df_no_duplicates <- remove_duplicates_in_column(df, 'A')
print(df_no_duplicates)

习题34:
题目:使用duplicated()函数标记一个数据框中的重复行。

答案:

# 假设数据框为df
duplicate_flags <- duplicated(df)
print(duplicate_flags)

习题35:
题目:对于一个包含个人信息的数据框,找出并删除所有重复的个人记录。

答案:

# 假设数据框为df,且个人信息由多个列组成,这里假设有'Name', 'Age', 'Address'三列
df_unique <- df[!duplicated(df[, c('Name', 'Age', 'Address')]), ]
print(df_unique)

习题36:
题目:编写代码,计算一个数据框中每列重复值的数量,并将结果存储为一个新的数据框。

答案:

# 假设数据框为df
count_duplicates <- function(df) {
  apply(df, 2, function(x) sum(duplicated(x)))
}

duplicate_counts <- as.data.frame(t(count_duplicates(df)))
names(duplicate_counts) <- colnames(df)
print(duplicate_counts)
(4)数据类型的转换与格式化

习题37:
题目:将一个包含日期字符串的列转换为日期类型。

答案:

# 假设数据框为df,日期字符串列名为'date_str'
df$date_str <- as.Date(df$date_str, format = "%Y-%m-%d") # 根据您的日期格式调整format参数
print(df$date_str)

习题38:
题目:编写一个函数,该函数接受一个数据框和一个列名作为参数,将该列中的数值转换为整数类型。

答案:

convert_to_integer <- function(df, column_name) {
  df[[column_name]] <- as.integer(as.numeric(df[[column_name]]))
  df
}

# 使用示例
df <- data.frame(Value = c("1", "2", "3.5", "4", "5.7"))
df <- convert_to_integer(df, 'Value')
print(df)

习题39:
题目:将一个包含货币格式字符串的列转换为数值类型,并保留小数点后两位。

答案:

# 假设数据框为df,货币格式字符串列名为'money_str',格式为'$1,234.56'
df$money_str <- gsub("[^0-9\\.]", "", df$money_str) # 移除货币符号和逗号
df$money_num <- round(as.numeric(df$money_str), 2) # 转换为数值并保留两位小数
print(df$money_num)

习题40:
题目:创建一个函数,该函数接受一个数据框和一个格式化字符串作为参数,将指定列中的数值按照给定格式进行格式化。

答案:

format_column <- function(df, column_name, format_str) {
  df[[column_name]] <- formatC(as.numeric(df[[column_name]]), format = format_str)
  df
}

# 使用示例
df <- data.frame(Value = c(12345, 67890, 13579))
df <- format_column(df, 'Value', format = "f", digits = 2) # 保留两位小数
print(df)

习题41:
题目:将一个包含因子类型(factor)的列转换为字符类型,并移除其水平(levels)。

答案:

# 假设数据框为df,因子类型列名为'factor_col'
df$factor_col <- as.character(df$factor_col)
levels(df$factor_col) <- NULL # 移除水平
print(df$factor_col)

习题42:
题目:分析一个数据框,找出所有非数值类型的列,并将它们转换为数值类型(如果可能)。

答案:

convert_non_numeric_to_numeric <- function(df) {
  numeric_cols <- sapply(df, is.numeric)
  non_numeric_cols <- names(df)[!numeric_cols]
  
  for (col in non_numeric_cols) {
    if (all(grepl("^[0-9.]+$", df[[col]]))) { # 检查是否只包含数字和点
      df[[col]] <- as.numeric(as.character(df[[col]]))
    } else {
      warning(paste("Column", col, "cannot be converted to numeric."))
    }
  }
  
  return(df)
}

# 使用示例
df <- data.frame(A = c(1, 2, 3), B = c("4", "5", "6"), C = c("x", "y", "z"))
df <- convert_non_numeric_to_numeric(df)
print(df)
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐