r - 使用 lapply 修剪数据以去除异常值
问题描述
我正在尝试使用lapply
修剪我的一些数据。我要做的是修剪列2:4
(删除异常值或极值),但也要删除列中的行。
每列中有一些异常值的数据。所以我想删除值100
和-100
inV1
但也删除数据中的整行。同时删除值80
和-80
列V2
- 随后也删除该行。
trimdata <- NULL
trimdata$ID <- seq.int(102)
trimdata$V1 <- c(rnorm(100), 100, -100)
trimdata$V2 <- c(rnorm(100), 80, -80)
trimdata$V3 <- c(rnorm(100), 120, -120)
trimdata <- as.data.frame(trimdata)
library(DescTools)
trimdata <- lapply(trimdata, function(x) Trim(x, trim = 0.01))
trimdata <- as.data.frame(trimdata)
上面的代码将函数应用于所有列(删除 ID 列中的极值)
这段代码:
trimdata[2:4] <- lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
返回以下错误
Error in `[<-.data.frame`(`*tmp*`, 2:4, value = list(V1 = c(0.424725933773568, :
replacement element 1 has 98 rows, need 100
所以我试图根据 2:4 列进行修剪,但也将其应用于第 1 列。
解决方案
您无法替换trimdata
因为函数中的值Trim
会删除元素,并且您会丢失替换所需的长度相等性。
这里有一个例子:
x <- rnorm(10)
length(x)
[1] 10
length(Trim(x, trim=0.1))
[1] 8
在Trim
函数之前你有 10 个元素,之后只有 8 个。
在您的示例Trim
中删除了 2 个元素,因此您在错误中有以下描述:
替换元素 1 有 98 行,需要 100
从Trim
文档:
将返回一个对称修剪的向量 x,其中包含从每一端删除的修剪观察值(分别为给定数量)的一部分。
在您的示例中,每列两行被修剪掉。如您所见,每列的行不同:
trim_out<-lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
lapply(trim_out, attributes)
$V1
$V1$trim
[1] 56 57
$V2
$V2$trim
[1] 63 47
$V3
$V3$trim
[1] 90 74
如果你想在输出中清理 data.frame ,你可以从你的 dataframe 中删除所有这些行trimdata
,如下所示:
trimdata[-unique(unlist(lapply(trim_out, attributes))),]
推荐阅读
- android - Android Studio:检查文件在代码中的创建位置
- python - Python 2 枚举示例
- firebase - Firebase go sdk:动态链接生成(用于登录的电子邮件链接与通用动态链接)
- android - Google Maps Android API:授权失败 - kotlin
- python - 当我向 MySQL 我的 Pandas DataFrame 写入数据时,没有得到第一列
- python - isinstance(...) 的功能;但没有实例?
- php - ACF 高级自定义字段乘法返回 0 而不是正确的数学答案
- c++ - 在 C++ 上使用 atomic_flag
- xml - 无法使用 Ansible 的 blockinfile 模块构造 XML
- python - 如何将列表中元组的第 i 个元素映射到另一个列表中的键以形成字典