我想获得一个数据框,其中只包含每个数字列2 SD内的数据。 我知道如何为单个列执行此操作但是如何一次为一堆列执行此操作? 这是玩具数据框:
df <- read.table(text = "target birds wolfs Country
3 21 7 a
3 8 4 b
1 2 8 c
1 2 3 a
1 8 3 a
6 1 2 a
6 7 1 b
6 1 5 c",header = TRUE)
以下是仅获取单个列(鸟类)的2 SD以下数据的代码行。如何同时为所有数字列执行此操作?
df[!(abs(df$birds - mean(df$birds))/sd(df$birds)) > 2,]
target birds wolfs Country
2 3 8 4 b
3 1 2 8 c
4 1 2 3 a
5 1 8 3 a
6 6 1 2 a
7 6 7 1 b
8 6 1 5 c
答案 0 :(得分:4)
我们可以使用lapply
循环数据集列,并根据numeric
和{{1}对if/else
个向量进行子集化(使用mean
条件) }。
sd
编辑:
我的印象是我们需要分别删除每列的异常值。但是,如果我们只需要保留数字列没有异常值的行,我们可以像以前一样使用lapply(df, function(x) if(is.numeric(x)) x[!(abs((x-mean(x))/sd(x))>2)] else x)
循环遍历列,而不是返回&#39; x&#39;,我们返回序列&#39; x&#39;然后使用lapply
获取intersect
元素的list
。数字索引可用于对行进行子集化。
Reduce
答案 1 :(得分:3)
我猜你试图通过检查数字列的所有是否在2 SD(?)
之内来过滤数据集在这种情况下,我建议创建两个过滤器。 1表示数字列,第2表示将检查所有数据列在2 SD内。对于第二个条件,我们可以使用内置的scale
函数
indx <- sapply(df, is.numeric)
indx2 <- rowSums(abs(scale(df[indx])) <= 2) == sum(indx)
df[indx2,]
# target birds wolfs Country
# 2 3 8 4 b
# 3 1 2 8 c
# 4 1 2 3 a
# 5 1 8 3 a
# 6 6 1 2 a
# 7 6 7 1 b
# 8 6 1 5 c