如何从数据框的多列中删除区域

时间:2015-09-17 09:28:29

标签: r dataframe

我想获得一个数据框,其中只包含每个数字列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

2 个答案:

答案 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