R语言200习题训练(带答案)(六)——数据清洗与整理
此部分内容会每日更新,包括但不限于基础知识,进阶知识,数据处理,图表展示,数据分析实战,机器学习算法等~ !!!
本人统计学硕士在读,想在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)
更多推荐
所有评论(0)