识别data.table中仅含正值与混合值的列
识别data.table中仅含正值与混合值的列
给定如下data.table数据:
temp_dt = structure(list(A = c(-1.4151, -1.2535, -0.7097, -0.4184, 0.0579, 0.2964, 0.7352, 0.8097, 0.7089, 0.4088), B = c(56.2776, 48.3075, 56.9811, 53.5512, 58.1714, 54.9303, 59.553, 53.5128, 50.3509, 46.1777), C = c(78.3689, 47.99, 88.1506, 71.2523, 94.6338, 81.2598, 90.4598, 67.8621, 54.8966, 35.9972), D = c(-11.3246, -9.9593, -5.6762, -3.3858, 0.1303, 1.8899, 4.9471, 5.4475, 4.7887, 2.8341 ), E = c(-0.0974, -0.1852, -0.0652, -0.0917, -0.0695, -0.0548, -0.0286, -0.0419, -0.0796, -0.0875)), row.names = c(NA, -10L), class = c("data.table", "data.frame"))
数据预览:
> temp_dt A B C D E 1: -1.4151 56.2776 78.3689 -11.3246 -0.0974 2: -1.2535 48.3075 47.9900 -9.9593 -0.1852 3: -0.7097 56.9811 88.1506 -5.6762 -0.0652 4: -0.4184 53.5512 71.2523 -3.3858 -0.0917 5: 0.0579 58.1714 94.6338 0.1303 -0.0695 6: 0.2964 54.9303 81.2598 1.8899 -0.0548 7: 0.7352 59.5530 90.4598 4.9471 -0.0286 8: 0.8097 53.5128 67.8621 5.4475 -0.0419 9: 0.7089 50.3509 54.8966 4.7887 -0.0796 10: 0.4088 46.1777 35.9972 2.8341 -0.0875
需求:识别数据表中仅含正值的列,以及同时包含正值和负值的混合值列。
解决方案
1. Base R 方法
通过colSums()结合逻辑判断,统计每列的负值数量,以此区分列类型:
# 提取仅含正值的列名 positive_cols = names(temp_dt)[colSums(temp_dt < 0) == 0] # 提取混合值列名(同时存在正负值) mixed_cols = names(temp_dt)[colSums(temp_dt < 0) > 0 & colSums(temp_dt > 0) > 0] # 输出结果 cat("仅含正值的列:", paste(positive_cols, collapse = ", "), "\n") cat("混合值列:", paste(mixed_cols, collapse = ", "), "\n")
运行输出:
仅含正值的列: B, C 混合值列: A, D, E
2. data.table 方法
利用data.table的.SD遍历列,结合自定义函数判断列属性:
library(data.table) # 生成列属性判断结果 col_attrs = temp_dt[, lapply(.SD, function(x) { has_neg = any(x < 0) has_pos = any(x > 0) ifelse(has_neg & has_pos, "混合值", "仅含正值") })] # 转换为易读的表格格式 col_attrs = melt(as.data.table(col_attrs), measure.vars = names(col_attrs), variable.name = "列名", value.name = "类型") print(col_attrs)
运行输出:
列名 类型 1: A 混合值 2: B 仅含正值 3: C 仅含正值 4: D 混合值 5: E 混合值
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

